VC++实现HTTP代理
HTTP代理:www对于每一个上网的人都再熟悉不过了,www连接请求就是采用的http协议,所以我们在浏览网页,下载数据(也可采用ftp协议)时就是用http代理。它通常绑定在代理服务器的80、3128、8080等端口上代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,须送出Request信号来得到回答,然后对方再把信息以bit方式传送回来。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。而且,大部分代理服务器都具有缓冲的功能,就好象一个大的Cache,它有很大的存储空间,它不断将新取得数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。更重要的是:Proxy Server(代理服务器)是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。主要的功能有:1.突破自身IP访问限制,访问国外站点。如:教育网、169网等网络用户可以通过代理访问国外网站。2.访问一些单位或团体内部资源,如某大学FTP(前提是该代理地址在该资源的允许访问范围之内),使用教育网内地址段免费代理服务器,就可以用于对教育 网开放的各类FTP下载上传,以及各类资料查询共享等服务。3.突破中国电信的IP封锁:中国电信用户有很多网站是被限制访问的,这种限制是人为的,不同Serve对地址的封锁是不同的。所以不能访问时可以换一个国 外的代理服务器试试。4.提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。5.隐藏真实IP:上网者也可以通过这种方法隐藏自己的IP,免受攻击。下面我们来实现HTTP代理[cpp]#include <stdio.h>#include <winsock2.h>#define MAXBUFLEN 20480#define HTTPADDLEN 50#define TIMEWAIT 2000#pragma comment(lib,"ws2_32.lib")SOCKET Global[1000];DWORD WINAPI Proxy( LPVOID pSocket);int ParseHttpRequest(char * SourceBuf,int DataLen,void * ServerAddr);int main(int argc,char * argv[]){SOCKET MainSocket,ClientSocket;struct sockaddr_in Host,Client;WSADATA WsaData;int AddLen,i;//初始化if(WSAStartup(MAKEWORD(2,2),&WsaData) < 0){printf("初始化失败\n");return 1;}//创建socket端口MainSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(MainSocket == SOCKET_ERROR){printf("端口创建错误\n");return 1;}Host.sin_family = AF_INET;Host.sin_port = htons(8080);Host.sin_addr.s_addr = inet_addr("127.0.0.1");printf("正在工作\n");//绑定socketif(bind(MainSocket,(SOCKADDR *)&Host,sizeof(Host)) != 0){printf("绑定错误\n");}i = 0;//监听if(listen(MainSocket,5) == SOCKET_ERROR){printf("监听错误\n");}AddLen = sizeof(Client);//连接新的客户i = 0;for(;;){ClientSocket = accept(MainSocket,(SOCKADDR *)&Client,&AddLen);if(ClientSocket == SOCKET_ERROR){printf("接受客户请求错误!\n");}printf(".");i ++ ;if( i >= 1000)i = 0;Global[i] = ClientSocket;//对于每一个客户启动不同的线程程进行控制//这个地方在使用ClientSocket的时候,要不要保证在某一时刻内只能有一个进程使用?CreateThread(NULL,0,Proxy,(LPVOID)Global[i],0,NULL);}return 0;}DWORD WINAPI Proxy( LPVOID pSocket){SOCKET ClientSocket;char ReceiveBuf[MAXBUFLEN];int DataLen;struct sockaddr_in ServerAddr;SOCKET ProxySocket;int i = 0;int time = TIMEWAIT;//得到参数中的端口号信息ClientSocket = (SOCKET)pSocket;//接受第一次请求信息memset(ReceiveBuf,0,MAXBUFLEN);DataLen = recv(ClientSocket,ReceiveBuf,MAXBUFLEN,0);if(DataLen == SOCKET_ERROR){printf("错误\n");closesocket(ClientSocket);return 0;}if(DataLen == 0){closesocket(ClientSocket);return 0;}//处理请求信息,分离出服务器地址if( Pars补充:软件开发 , Vc ,
上一个:VC++实现文件关联
下一个:VC++实现数据包嗅探
- 更多VC++疑问解答:
- VC++ 算法。
- MFC CListCtrl获取列数出错了,怎么回事?
- 谁有VC++6.0企业版中文版的下载地址
- vc++,关于TextOut的一个小问题
- 定义一个三维的CStringArray//一定要使用CArray模板?那操作的时候,使用那个类的函数对数组进行操作呢?
- 关于mfc消息映射的问题
- MFC中用TextOut输出的问题
- 请问如何在VC6.0里MFC下对万年历进行编程
- iArray.Add(iValue);//Add函数的参数不可以用CArray模板???
- 'USES_CONVERSION' : undeclared identifier;'A2W' : undeclared identifier
- vc6.0能不能用CImage,能的话给个例子,以及atlimage.h,
- VC 对话框 标题栏 怎么变成这个样子????如图!
- spin控件的UDN_DELTAPOS消息//下面代码什么作用? [
- VC修改DNF
- vc 套接字 struct