


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 流动科技馆观后感范文
- 海洋增材制造产业发展概述
- 海洋航道建设与维护
- 老年护理介绍课件教学
- 拆除工程合同履约及终止合同
- 夫妻离婚后彩礼返还及财产分割协议
- 材料物理晶体物理物理物理物理物理物理电化学合同
- 边疆古代民族舞蹈考古合同
- 餐饮行业拆伙退伙协议书(财务清算)
- 牛场租赁与绿色养殖技术支持合同
- 门店营销课件 完整版
- 高效执行四原则(课堂PPT)
- HEP-15,HEP-16,HEP-17系列电气阀门定位器
- DDST(丹佛发展筛选试验)相关知识考核试题及答案
- 史记《孔子世家》原文
- 门式刚架轻型房屋钢结构设计
- 《古生物学》讲义
- I地址的分类与管理
- 山东农业大学工程造价与招投标(专升本)期末考试复习题
- 国开大学2023年01月11237《物流管理基础》期末考试答案
- 胃癌常见手术方式
评论
0/150
提交评论