打造自己的HTTP代理服务器_第1页
打造自己的HTTP代理服务器_第2页
打造自己的HTTP代理服务器_第3页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、打造自己的 HTTP 代理服务器打造自己的 HTTP 代理服务器/*=file:HTTPPROXY .cppHTTP Proxy v1.0powered by shadow 2004/11/14QQ:176017352请先阅读有关 http 代理协议的相关资料 ,转载请著明出 处=*/#include "stdafx.h"#include "HTTPPROXY .h"#define FD_NOEVENT 0/#define BACKUP 100#define MAXDATALEN 65535 int HttpListenPort;SOCKET HttpL

2、istenSock;/ typedef struct _CLIENTINFO SOCKET clientsock;SOCKET udpsock; sockaddr_in clientsock_addr;CLIENTINFO,*LPCLIENTINFO; CLIENTINFO HttpClientInfo;/typedef struct _SOCKINFOSOCKET sourcesock;SOCKET destsock; SOCKINFO,*LPSOCKINFO;SOCKINFO httpsockinfo;/extern long GetSocketEventId(SOCKET remotes

3、ock); extern unsigned long GetLocalIp();extern unsigned long GetDomainIp(char domainname250);/*long GetSocketEventId(SOCKET remotesock) long EventId;HANDLE hevent;hevent=CreateEvent(NULL,0,0,0);WSANETWORKEVENTS socket_events;EventId=FD_NOEVENT;if(WSAEventSelect(remotesock,hevent,FD_ACCEPT|FD_CONNECT

4、|FD_READ|FD_WRITE|FD_CLOSE)=SOCKET_ERR OR) return EventId;WSAEnumNetworkEvents(remotesock,hevent,&socket_ev ents);if(socket_events.lNetworkEvents!=0) switch(socket_events.lNetworkEvents) case FD_ACCEPT:EventId=FD_ACCEPT;break; case FD_CONNECT:EventId=FD_CONNECT;break; case FD_READ:EventId=FD

5、_READ;break; case FD_WRITE:EventId=FD_WRITE;break; case FD_CLOSE:EventId=FD_CLOSE;break; case FD_OOB:EventId=FD_OOB;break; default:EventId=FD_NOEVENT;break;else EventId=FD_NOEVENT; return EventId;/unsigned long GetLocalIp()char IPMAX_PATH,*ip;char pc_name80; struct in_addr in;struct hostent *host;WO

6、RD wVersionRequested; WSADATA wsaData;wVersionRequested=MAKEWORD(2,0); ip=IP;strcpy(ip,"Ip not get!"); if(WSAStartup(wVersionRequested,&wsaData) return 0;if(gethostname(pc_name,80)=SOCKET_ERROR) WSACleanup();return 0; if(!(host=gethostbyname(pc_name)WSACleanup(); return 0;in.s_addr

7、=*(unsigned long *)host->h_addr_list0); strcpy(ip,inet_ntoa(in);WSACleanup();return in.s_addr;/unsigned long GetDomainIp(char domainname250) char IPMAX_PATH,*ip;struct in_addr in;struct hostent *host;WORD wVersionRequested;WSADATA wsaData; wVersionRequested=MAKEWORD(2,0); ip=IP;strcpy(ip,&quo

8、t;Ip not get!"); if(WSAStartup(wVersionRequested,&wsaData) return 0;if(!(host=gethostbyname(domainname)WSACleanup();return 0;in.s_addr=*(unsigned long *)host->h_addr_list0); strcpy(ip,inet_ntoa(in);WSACleanup();return in.s_addr;*/UINT HttpReciveThread(LPVOID info) / 针对客户端的 接收处理线程

9、LPSOCKINFO psockinfo;SOCKET sourcesock,destsock;char dataMAXDATALEN;long eventid;int datalen; psockinfo=(LPSOCKINFO)info; sourcesock=psockinfo->sourcesock; destsock=psockinfo->destsock;TRACE("deail recive thread ok!rn");while(true) eventid=GetSocketEventId(sourcesock); switch

10、(eventid) case FD_CLOSE:TRACE("s fdclosedrn"); closesocket(destsock);return 1; break;default:break; eventid=GetSocketEventId(destsock); switch(eventid)case FD_CLOSE: closesocket(sourcesock);TRACE("d fdclosedrn"); return 1;break; default:break;datalen=recv(sourcesock,data,sizeof(d

11、ata),0); if(datalen=0)closesocket(sourcesock);closesocket(destsock);TRACE("s fdclosedrn"); break; if(datalen>0) while(!send(destsock,data,datalen,0);Sleep(1);return 1;/针对远程端的接UINT HttpSendThread(LPVOID info) / 收处理线程LPSOCKINFO psockinfo;SOCKET sourcesock,destsock; char dataMAXDATALEN

12、; long eventid;int datalen; psockinfo=(LPSOCKINFO)info; sourcesock=psockinfo->sourcesock; destsock=psockinfo->destsock;TRACE("deail send thread ok!rn"); while(true) eventid=GetSocketEventId(sourcesock); switch(eventid) case FD_CLOSE:TRACE("s fdclosedrn"); closesocke

13、t(destsock);return 1;break;default:break;eventid=GetSocketEventId(destsock); switch(eventid)case FD_CLOSE: closesocket(sourcesock); TRACE("d fdclosedrn");return 1;break;default:break; datalen=recv(destsock,data,sizeof(data),0); if(datalen=0)closesocket(sourcesock);closesocket(destsock);TRA

14、CE("d fdclosedrn");break;if(datalen>0) while(!send(sourcesock,data,datalen,0);Sleep(1);return 1;/UINT HttpProxyServerThread(LPVOID info) / 针对一次 服务的线程LPCLIENTINFO pclientinfo;SOCKET connectsock,clientsock;sockaddr_in remotesock_addr;char dataMAXDATALEN,url250,temp250,httpurl250,portn

15、um 10;int datalen,i,index_start,index_end,port; CString HttpString,UrlString,PortString; pclientinfo=(LPCLIENTINFO)info; clientsock=pclientinfo->clientsock;ZeroMemory(void *)data,sizeof(data); datalen=recv(clientsock,data,sizeof(data),0);if(datalen<=0) closesocket(clientsock);return 0;

16、HttpString.Format("%s",data); UrlString=HttpString;TRACE("get http string:rn");TRACE(HttpString);index_start=HttpString.Find("Host: ",0); / 寻找 url 标记 if(index_start<=0)closesocket(clientsock); return 0; index_end=HttpString.Find("rn",index_start);if(ind

17、ex_end<=0) closesocket(clientsock);return 0;UrlString=HttpString.Mid(index_start+6,index_end-index_start-6); /读取 url 字符串TRACE("rn get url:");TRACE(UrlString);wsprintf(url,"%s",UrlString);strcpy(temp,url);strcat(temp,":");datalen=strlen(temp);if(HttpString.Find(&q

18、uot;GET",0)=0) / 判断 get 命令,并处理index_start=HttpString.Find(temp,0); strcpy(httpurl,"http:/");if(index_start>0) index_end=HttpString.Find("/",index_start);if(index_end<=0)closesocket(clientsock);return 0;PortString=HttpString.Mid(index_start+datalen,index_end-ind

19、ex_start-datalen);port=atoi(PortString);strcat(httpurl,temp); itoa(port,portnum,sizeof(portnum); strcat(httpurl,portnum);strcat(httpurl,"/");elseport=80;strcat(httpurl,url);strcat(httpurl,"/");TRACE("get http url:%srn",httpurl);HttpString.Replace(httpurl,"/");

20、HttpString.Replace("Proxy-","");HttpString.Replace("HTTP/1.0","HTTP/1.1");判断else if(HttpString.Find("CONNECT",0)=0) /connect 命令并处理index_start=HttpString.Find(temp,0);if(index_start>0)index_end=HttpString.Find(" ",index_start);if(inde

21、x_end<=0)closesocket(clientsock);return 0;PortString=HttpString.Mid(index_start+datalen,index_end-inde x_start-datalen);port=atoi(PortString);elseclosesocket(clientsock);return 0;TRACE("get new http string:rn");TRACE(HttpString);remotesock_addr.sin_family=AF_INET;remotesock_addr.sin

22、_port=htons(port);connectsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(connect(connectsock,(const sockaddr *)&remotesock_addr,sizeof(remotesock_addr)=INV ALI D_SOCKET) / 连接远程主机closesocket(clientsock);return 0;TRACE("rnconnect to remote ip okrn");ZeroMemory(void *)data,sizeof(data

23、); wsprintf(data,"%s",HttpString);datalen=strlen(data);if(HttpString.Find("CONNECT",0)<0) while(!send(connectsock,data,datalen,0);elsestrcpy(data,"HTTP/1.0 200 Connection establishedrnProxy-agent: CHTTPPROXY V1.0 powered by shadowrnrn");datalen=strlen(data);while

24、(!send(clientsock,data,datalen,0);httpsockinfo.sourcesock=clientsock;httpsockinfo.destsock=connectsock;AfxBeginThread(HttpReciveThread,(LPVOID)&httpsocki nfo); / 抛出处理线程AfxBeginThread(HttpSendThread,(LPVOID)&httpsockinf o); /Sleep(100);return 1;/UINT StartHttpProxy(LPVOID info) / 端口监听

25、线程SOCKET NewSock;int socklen;sockaddr_in serversock,remotesock_addr;HttpListenSock=socket(AF_INET,SOCK_STREAM,IPPROTO _TCP);if(HttpListenSock=INV ALID_SOCKET) return 0; if(bind(HttpListenSock,(const sockaddr*)&serversock,sizeof(serversock)=SOCKET_ERROR) return 0;listen(HttpListenSock,BACKUP)

26、; socklen=sizeof(remotesock_addr);TRACE("start http proxy thread whilern"); while(true)NewSock=accept(HttpListenSock,(sockaddr *)&remotesock_addr,&socklen);TRACE("waitting ok.rn");if(NewSock=INV ALID_SOCKET)Sleep(1);continue;ZeroMemory(void *)&HttpClientInfo,sizeof(CLIENTINFO);HttpClientInfo.clientsock=NewSock;HttpClientInfo.clientsock_addr=remotesock_addr; TRACE("start proxy threadrn");Afx

温馨提示

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

评论

0/150

提交评论