当前位置:编程学习 > VC++ >>

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");   
   //绑定socket  
   if(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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,