基于winsock技术编制HTTP代理服务器程序_第1页
基于winsock技术编制HTTP代理服务器程序_第2页
基于winsock技术编制HTTP代理服务器程序_第3页
基于winsock技术编制HTTP代理服务器程序_第4页
基于winsock技术编制HTTP代理服务器程序_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于winsock技术编制HTTP代理服务器程序xxxxxxxxxxxxxxxxxxx摘要:HTTP协议即超文本传输协议,是Internet上进行信息传输时使用最为广泛的一种非常简朴的通信协议。部分局域网对协议进行了限制,只允许用户通过HTTP协议访问外部网站。本次编制运用winsock技术网络编程的技术,分析http代理应用程序设计原理,然后选择合适的开发环境用winsock技术来设计http代理的应用程序。关键词:HTTP协议winsock信息传输一.研究背景Windows下网络编程的规范-WindowsSockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口,现已成为Windows网络编程的事实上的标准。WindowsSockets规范本旨在于提供应应用程序开发者一套简朴的API,并让各家网络软件供应商共同遵守。此外,在一个特定版本Windows的基础上,WindowsSockets也定义了一个二进制接口(ABI),以此来保证应用WindowsSocketsAPI的应用程序可以在任何网络软件供应商的符合WindowsSockets协议的实现上工作。因此这份规范定义了应用程序开发者可以使用,并且网络软件供应商可以实现的一套库函数调用和相关语义。本次编制是基于winsock网络编程的技术,分析http代理应用程序设计原理,然后选择合适的开发环境用winsock技术来设计http代理的应用程序。1.http代理www对于每一个上网的人都再熟悉但是了,www连接请求就是采用的http协议,所以我们在浏览网页,下载数据(也可采用ftp协议)是就是用http代理。它通常绑定在代理服务器的80、3128、8080等端口上。2.http协议HTTP协议即超文本传输协议,是Internet上进行信息传输时使用最为广泛的一种非常简朴的通信协议。部分局域网对协议进行了限制,只允许用户通过HTTP协议访问外部网站。3.http代理服务器代理服务器英文全称是ProxyServer,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,须送出Request信号来得到回答,然后对方再把信息以bit方式传送回来。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。并且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,假如浏览器所请求的数据在它本机的存储器上已经存在并且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。更重要的是:ProxyServer(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,它的工作重要在开放系统互联(OSI)模型的对话层。二.winsock理解winsock网络编程技术,分析HTTP代理应用程序设计原理和程序流程,选择合适的开发环境,参考已有的HTTP程序功能,设计实现HTTP代理功能的应用程序。使用网络编程技术,这就规定掌握Winsock的相关知识,由于WinSock其实就是TCP/IP协议的一种封装,我们可以通过调用WinSock的接口函数来调用TCP/IP的各种功能,例如假如想用TCP/IP协议来发送数据,你就可以使用WinSock的接口函数Send()来调用TCP/IP的发送数据功能,至于具体怎么发送数据,WinSock已经帮你封装好了这种功能,当然这里的TCP/IP协议准确的说来应当是TCP/UDP/IP协议。Winsocket函数:Windows的Socket函数有许多,

我没有做具体介绍,这里的函数都是简要说明其用途,

这里的重要目的是为了后面的三个应用服务。函数说明:

1.WSAStartup函数:初始化Winsock

[声明]

int

WSAStarup(WORD

wVersionRequested,LPWSADATA

lpWSAData);

[参数]

wVersionRequested

-

规定使用Winsock的最低版本号

lpWSAData

-

Winsock的具体资料

[返回值]

当函数成功调用时返回0,失败时返回非0的值

2.socket函数

用于生成socket(soket

Descriptor)

[声明]

SOCKET

socket(int

af,int

type,int

protocol);

[参数]

af

-

地址家族(通常使用:AF_INET)

type

-

socket的种类

SOCK_STREAM

:

用于TCP协议

SOCK_DGRAM

:

用于UDP协议

protocol

-

所使用的协议

[返回值]

当函数成功调用时返回一个新的SOCKET(Socket

Descriptor);失败时返回INVALID_SOCKET.

3.inet_addr函数:地址转换,

把"A.B.C.D"的IP地址转换为32位长整数

[声明]

unsigned

long

inet_addr

(

const

char

FAR

*cp

);

[参数]

cp

-

指向IP地址字符串的指针

[返回值]

当函数成功调用时返回用32位整数表达的IP地址;失败时返回INADDR_NONE.

4.gethostbyname函数:从主机名获取主机信息.

[声明]

struct

hostent

FAR

*

gethostbyname

(const

char

FAR

*name);[参数]

name

-

指向主机名字符串的指针

[返回值]

当函数成功调用时返回主机信息;失败时返回NULL(空值).5.recv函数:运用Socket进行接受数据.

[声明]

int

recv

(SOCKETs

,charFAR

*buf,intlen,int

flags

);[参数]

s

-

指向用Socket函数生成的Socket

Descriptor

buf

-

接受数据的缓冲区(数组)的指针

len

-

缓冲区的大小

flag

-

调用方式(MSG_PEEK

MSG_OOB)

[返回值]成功时返回收到的字节数.假如连接被中断则返回0。失败时返回

SOCKET_ERROR

6.sendto函数:发送数据.

[声明]

int

sendto

(SOCKET

s,constchar

FAR

*buf

,int

len,int

flags,const

struct

sockaddr

FAR

*to,int

token);

[参数]

s

-

指向用Socket函数生成的Socket

Descriptor

buf

-

接受数据的缓冲区(数组)的指针

len

-

缓冲区的大小

flag

-

调用方式(MSG_DONTROUTE

,

MSG_OOB)

to

-

指向发送方SOCKET地址的指针

token

-

发送方SOCKET地址的大小

[返回值]

成功时返回已经发送的字节数.失败时返回SOCKET_ERROR

有关http代理协议的体系结构代理是一种应用层上面的代理,所代理的协议是HTTP,也就是经常见到的Web代理,网络代理就是一个连接客户端(设定需要代理的计算机)和服务器端(需要访问资源的服务器)的桥,以下是网络代理服务的一个典型模型图:图3-1本体学习周期代理服务的运营的流程:(1).可以接受并解析客户端的请求。(2).创建到服务器的新连接,并根据转发客户端的请求信息。(3).接受服务器反馈的信息。(4).可以发出或解释服务器的响应并将该响应传回给客户端。具体设计1.设计方案:重要涉及三个部分内容:1)创建一个Web代理类。2)Web代理服务的类的实例化。3)通过这个Web代理类的实例实现Web代理服务。设计流程图如下:实例连接web服务器上实例连接web服务器上侦听端口,接受客户端浏览器发送来的Web请求信息解析出Web服务器的地址,创建socket实例通过创建的Socket传送客户端的Web请求数据包到Web服务器的80端口接受Web服务器返回页面数据把接受来的数据传送到客户端完毕,实现了web代理2.选择开发环境,编译源程序选择visualstudio.net2023开发环境,源程序编译及环节:1)创建一个web代理类,命名WebProxy,编辑Proxy.cs文献:usingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.IO;//以上代码是导入Proxy.cs中要使用到的命名空间2)用下列构造函数替代默认的构造函数。下面的代码是在Proxy类中创建一个构造函数。Proxy类只有一个构造函数,并且这个构造函数只有一个参数,这个参数是Socket对象,它重要用来和客户端进行数据互换,是一个客户Socket。publicProxy(Socketsocket){this.clientSocket=socket;}3)创建Proxy类中的Run方法,Run方法是Proxy类中唯一的方法。其功能是从客户端接受HTTP请求,并传送到Web服务器,然后从Web服务器接受反馈来的数据,并传送到客户端。为了实现这二个不同方面的数据传送,Run方法中是通过二个Socket实例来实现的。由于HTTP是TCP/IP参考模型中的应用层协议,它建立于TCP协议之上,所以创建的Socket实例使用的协议类型应当为TCP协议。下面代码是创建可以传送HTTP请求命令到Web服务器和接受来自Web服务器反馈来信息的Socket实例:SocketIPsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

4)此外一个Socket是在代理服务程序侦听端标语,接受挂起的连接请求时候得到的,以此Socket为参数,运用Proxy类中的构造函数,来创建一个Proxy实例的。此Socket实现从客户端接受HTTP请求信息,并传送数据到客户端。创建Proxy类的Run方法:publicvoidRun()

{stringclientmessage="";//存放来自客户端的HTTP请求字符串stringURL="";//存放解析出地址请求信息intbytes=ReadMessage(read,refclientSocket,refclientmessage);

if(bytes==0)

{return;}intindex1=clientmessage.IndexOf('');

intindex2=clientmessage.IndexOf('',index1+1);

if((index1==-1)||(index2==-1))

{thrownewIOException();}stringpart1=clientmessage.Substring(index1+1,index2-index1);intindex3=part1.IndexOf('/',index1+8);

intindex4=part1.IndexOf('',index1+8);

intindex5=index4-index3;

URL=part1.Substring(index1+4,(part1.Length-index5)-8);try{IPHostEntryIPHost=Dns.Resolve(URL);

Console.WriteLine("远程主机名:"+IPHost.HostName);

string[]aliases=IPHost.Aliases;

IPAddress[]address=IPHost.AddressList;

Console.WriteLine("Web服务器IP地址:"+address[0]);//解析出要访问的服务器地址

IPEndPointipEndpoint=newIPEndPoint(address[0],80);

SocketIPsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建连接Web服务器端的Socket对象

IPsocket.Connect(ipEndpoint);//Socket连Web接服务器5)在定义Proxy类代码区中加入下列代码:SocketclientSocket;

Byte[]read=newbyte[1024];

//定义一个空间,存储来自客户端请求数据包

Byte[]Buffer=null;

EncodingASCII=Encoding.ASCII;

//设定编码

Byte[]RecvBytes=newByte[4096];

//定义一个空间,存储Web服务器返回的数据6)把Proxy类实例化具体语法如下:publicProxy(Socketsocket);参数:socket为一个Scoket实例Proxyproxy=newProxy(socket);//创建一个Proxy实例:7).运用Proxy类,实现Web代理:运用上面创建的Proxy类,实现Web代理程序的具体实现环节,Proxy类被定义在命名空间WebProxy中。在Class1.cs源文献的开头导入下列命名空间:usingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.IO;usingSystem.Threading;usingWebProxy;//其中命名空间WebProxy是Proxy类所处的位置,具体可以参阅Proxy.cs源文献中命名空间的定义。8).在Main函数中添加下列代码,下列代码是运用Proxy类,来实现Web代理程序。constintport=8000;//定义端标语

TcpListenertcplistener=newTcpListener(port);

Console.WriteLine("侦听端标语:"+port.ToString());

tcplistener.Start();//侦听端标语

while(true){Socketsocket=tcplistener.AcceptSocket();

//并获取传送和接受数据的Scoket实例

Proxyproxy=newProxy(socket);//Proxy类实例化

Threadthread=newThread(newThreadStart(proxy.Run));

//创建线程

thread.Start();//启动线程}至此简朴Web代理程序就算是完毕了。软件测试此代理程序侦听的是8000端标语。代理程序要通过二台计算机才可以实现。其中的一台计算机运营Web代理程序,充当Web代理服务器。此外一台计算机充当客户机,通过Web代理服务器来浏览网页。在拟定Web代理软件运营后,对客户机进行必要的设立:通过设立IE浏览器的Internet选项设立代理服务器相关的信息,在其中的地址文本框中输入代理服务器的IP地址,由于测试的代理服务器的IP地址为"02",所有也输入此IP地址,在端口文本框中输入"8000"。客户端的设立完毕之后,在拟定IP地址为"02"的这台计算机已经运营代理程序后。打开客户端的IE浏览器,并输入要浏览的网址,就可以通过Web代理服务器来浏览网页了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论