版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030中国网游行业调研及市场前景预测评估报告
- 2025国家电投集团数字科技有限公司招聘10人(第三批)笔试考试备考试题及答案解析
- 卫星仓建设协议
- 配送机器人系统开发协议
- 2025广西南宁上林县林业局招聘编外林业技术人员2人笔试考试备考试题及答案解析
- 2025年福建医科大学附属第二医院招聘非在编工作人员9人笔试考试备考题库及答案解析
- 2025香水行业市场发展分析与发展趋势及投资前景预测报告
- 2025香料植物种植产业当前供求调研与资源投放方向规划研究报告
- 2025四川德阳市第十六中学校招聘临聘人员11人笔试考试参考试题及答案解析
- 2025预制菜行业消费趋势市场分析投资潜力规划研究报告
- 标准作业指导书模板(SOP)
- 科室质控小组活动内容及要求
- 图形创意应用课件
- 胸痛中心联合例会与质控分析会-ACS患者如何更好的管理时间
- 北京师范大学珠海校区
- 竖窑控制系统手册
- 煤矿投资可行性研究分析报告
- DOE实验设计实例分析(附理论培训教程)课件
- DB4403-T 63-2020 建设工程施工噪声污染防治技术规范-(高清现行)
- 高强度螺栓连接施拧记录
- 外墙干挂石材修补施工方案
评论
0/150
提交评论