LoveUnix » 编程开发 & Rational » 原创 socks5协议转http协议源码
让LU留住您的每

一天 让LU博客留住您的每一天
2004-6-5 10:36 无双
socks5代理可以看rfc 1928<br />socks5的用户名口令认证方法看rfc 1929<br /><br />http代理可以看 rfc2616<br />socks5代理可以支持tcp和udp 而http只支持tcp<br /><br />所以这个代理转换器只支持tcp<br /><br /><br />写作原因<br />很多软件都有socks5认证方法 但是它们不支持http认证方法<br />而从原理上可以使用http认证方法(因为它们没有使用udp)<br />所以写这个软件可以方便的使其它程序可以使用http代理<br /><br />如联众 或是foxmail<br /><br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />#include &#60;winsock2.h&#62;<br />#include &#60;stdio.h&#62;<br />#include &#60;stdlib.h&#62;<br />#define INIT_SOCKET&#40;&#41;{WSADATA &nbsp; wsadata;WSAStartup&#40;MAKEWORD&#40;2,2&#41;,&amp;wsadata&#41;;}<br />#define CLOSESOCKET&#40;x&#41; closesocket&#40;x&#41;<br />#define CLEAN_SOCKET&#40;&#41; &nbsp;{WSACleanup&#40;&#41;;}<br />// &nbsp;http.c &nbsp;实现http代理功能<br /><br />#define PROTO_EXCHANGE_TIMEOUT 15<br />#define PROTO_RECVRESP_TIMEOUT 75<br />#define PROTO_SENDRESP_TIMEOUT 10<br /><br />#define WAIT_AND_RECV&#40;sd,buf,len,waittime,recvflags&#41; &nbsp; &nbsp;do{\<br /> &nbsp; &nbsp;struct fd_set sset;\<br /> &nbsp; &nbsp;struct timeval waited;\<br /> &nbsp; &nbsp;waited.tv_sec &nbsp; = waittime;waited.tv_usec &nbsp; = 0;\<br /> &nbsp; &nbsp;FD_ZERO&#40;&amp;sset&#41;;FD_SET&#40;sd,&amp;sset&#41;;\<br /> &nbsp; &nbsp;if&#40;select&#40;sd+1,&amp;sset,NULL,NULL,&amp;waited&#41; &#33;= 1 || &#40;len = recv&#40;sd,buf,len,recvflags&#41;&#41; == -1 &#41;\<br /> &nbsp; &nbsp;len = -1;\<br />}while&#40;0&#41;;<br /><br />#define DEBUG_DUMP &nbsp; &nbsp; &nbsp;printf<br /><br />static int httpproxy_connect&#40;const char*proxyaddr,int proxyport,<br /> &nbsp; &nbsp; &nbsp; &nbsp;const char*dstaddr,int dstport&#41;<br />{<br /> &nbsp; &nbsp;int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxysd = -1;<br /> &nbsp; &nbsp;char &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;buf&#91;2048&#93;;<br /> &nbsp; &nbsp;int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; len;<br /> &nbsp; &nbsp;char &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*ptoken;<br /> &nbsp; &nbsp;int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; status;<br /><br /> &nbsp; &nbsp;struct &nbsp;sockaddr_in inaddr;<br /><br /> &nbsp; &nbsp;if&#40; &#33;proxyaddr || &#33;proxyaddr&#91;0&#93; || proxyport &#60; 1<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;||&#33;dstaddr || &#33;dstaddr&#91;0&#93; &#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /><br /> &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;代理&#58;%s&#58;%d,目标&#58;%s&#58;%d\n&#34;,proxyaddr,proxyport,dstaddr,dstport&#41;;<br /><br /> &nbsp; &nbsp;len &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = sizeof&#40;inaddr&#41;;<br /> &nbsp; &nbsp;memset&#40;&amp;inaddr,0,len&#41;;<br /> &nbsp; &nbsp;if&#40; &#40;inaddr.sin_addr.s_addr = inet_addr&#40;proxyaddr&#41; &#41; == INADDR_NONE &#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /><br /> &nbsp; &nbsp;inaddr.sin_family &nbsp; &nbsp;= AF_INET;<br /> &nbsp; &nbsp;inaddr.sin_port &nbsp; &nbsp; &nbsp;= htons&#40;proxyport&#41;;<br /><br /> &nbsp; &nbsp;// &nbsp;connect to proxy<br /> &nbsp; &nbsp;if&#40;&#40;proxysd = socket&#40;AF_INET,SOCK_STREAM,0&#41;&#41; == -1 &#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /> &nbsp; &nbsp;if&#40; connect&#40;proxysd,&#40;struct sockaddr*&#41;&amp;inaddr,len&#41;&#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;goto errorparse;<br /><br /> &nbsp; &nbsp;// &nbsp;发送connect请求并判断返回,根据HTTP协议说明,详细内容请看RFC2616<br /> &nbsp; &nbsp;// &nbsp;HTTP代理使用CONNECT指令实现,CONNECT时指定选端的地址与端口号,<br /> &nbsp; &nbsp;// &nbsp;当代理服务器返回成功后&#40;状态值是2xx&#41;,后面的代理服务器不再对此连接的数据<br /> &nbsp; &nbsp;// &nbsp;进行HTTP协议处理<br /> &nbsp; &nbsp;if&#40; dstport &#62; 0 &#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;len = sprintf&#40;buf,&#34;CONNECT %s&#58;%d HTTP/1.1\r\n\r\n&#34;,dstaddr,dstport&#41;;<br /> &nbsp; &nbsp;else<br /> &nbsp; &nbsp; &nbsp; &nbsp;len = sprintf&#40;buf,&#34;CONNECT %s HTTP/1.1\r\n\r\n&#34;,dstaddr&#41;;<br /><br /> &nbsp; &nbsp;if&#40; send&#40;proxysd,buf,len,0&#41; &#33;= len &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;发送CONNECT请求失败&#58;包内容&#58;%s\n&#34;,buf&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;goto errorparse;<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;len = sizeof&#40;buf&#41;-1;<br /> &nbsp; &nbsp;WAIT_AND_RECV&#40;proxysd,buf,len,PROTO_RECVRESP_TIMEOUT,MSG_PEEK&#41;;<br /> &nbsp; &nbsp;if&#40; len == -1&#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;接收CONNECT响应失败\n&#34;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;goto errorparse;<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;buf&#91;len&#93; &nbsp; &nbsp;= 0;<br /> &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;CONNECT响应为&#58;%s|\n&#34;,buf&#41;;<br /> &nbsp; &nbsp;if&#40; strnicmp&#40;buf,&#34;HTTP/1.&#34;,7&#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|| &#40;&#33;strstr&#40;buf,&#34;\r\n\r\n&#34;&#41; &amp;&amp; &#33;strstr&#40;buf,&#34;\n\n&#34;&#41;&#41;&#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;goto errorparse;<br /><br /> &nbsp; &nbsp;ptoken &nbsp;= buf;<br /> &nbsp; &nbsp;while&#40;&#33;isspace&#40;*ptoken&#41; &amp;&amp; *ptoken&#41; ptoken ++;<br /> &nbsp; &nbsp;status &nbsp;= atoi&#40;ptoken&#41;;<br /> &nbsp; &nbsp;if&#40; status &#60; 300 &amp;&amp; status &#62; 199 &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;ptoken &nbsp;= strstr&#40;buf,&#34;\r\n\r\n&#34;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;if&#40; ptoken &#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;len &nbsp;= ptoken - buf +4;<br /> &nbsp; &nbsp; &nbsp; &nbsp;else{<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ptoken = strstr&#40;buf,&#34;\n\n&#34;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;len &nbsp;= ptoken - buf +2;<br /> &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp; &nbsp; &nbsp;WAIT_AND_RECV&#40;proxysd,buf,len,PROTO_RECVRESP_TIMEOUT,0&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return proxysd;<br /> &nbsp; &nbsp;}<br /><br />errorparse&#58;<br /> &nbsp; &nbsp;CLOSESOCKET&#40;proxysd&#41;;<br /> &nbsp; &nbsp;return -1;<br />}<br /><br />// &nbsp;sd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#91;in&#93; &nbsp; &nbsp;使用socks5的客户端的连接id<br />// &nbsp;proxyaddr &nbsp; &#91;in&#93; &nbsp; &nbsp;http代理地址<br />// &nbsp;proxyport &nbsp; &#91;in&#93; &nbsp; &nbsp;http代理端口<br />// &nbsp;return&#58;<br />// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-1 &nbsp;失败<br />// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#62;=0 与http代理的连接id<br />static int socks5_accept&#40;int sd,const char *proxyaddr,int proxyport&#41;<br />{<br /> &nbsp; &nbsp;unsigned char &nbsp; &nbsp; &nbsp; buf&#91;512&#93;;<br /> &nbsp; &nbsp;int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; len = 2;<br /> &nbsp; &nbsp;int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i &nbsp; = 0;<br /> &nbsp; &nbsp;char &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dstaddr&#91;260&#93;;<br /> &nbsp; &nbsp;int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dstport;<br /><br /> &nbsp; &nbsp;if&#40; &#33;proxyaddr || &#33;proxyaddr&#91;0&#93; || proxyport &#60;1 &#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /><br /> &nbsp; &nbsp;// &nbsp;处理协商,现在只处理无认证情况,无论对方会不会处理这种情况<br /> &nbsp; &nbsp;// &nbsp;没有要求无认证方式,sorry,那我就不理它<br /> &nbsp; &nbsp;// &nbsp;另外只处理SOCKS5的CONNECT命令,其它不处理<br /> &nbsp; &nbsp;WAIT_AND_RECV&#40;sd,&#40;char*&#41;buf,len,PROTO_EXCHANGE_TIMEOUT,0&#41;;<br /> &nbsp; &nbsp;if&#40; len &#33;= 2 || buf&#91;0&#93; &#33;= 5 &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;接收socks5协商包失败,len&#58;%d,buf&#91;0&#93;&#58;%d\n&#34;,len,buf&#91;0&#93;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /> &nbsp; &nbsp;}<br /> &nbsp; &nbsp;len = buf&#91;1&#93;;<br /> &nbsp; &nbsp;i &nbsp; = len;<br /> &nbsp; &nbsp;WAIT_AND_RECV&#40;sd,&#40;char*&#41;buf,i,PROTO_EXCHANGE_TIMEOUT,0&#41;;<br /> &nbsp; &nbsp;if&#40; len &#33;= i &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;接收socks5协商包失败,想接收%d,收到&#58;%d\n&#34;,len,i&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;for&#40; i = 0;i&#60; len &amp;&amp; buf&#91;i&#93;;i++ &#41;;<br /><br /> &nbsp; &nbsp;if&#40; i == len &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;用户没有请求socks5无认证方法&#58;\n&#34;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;buf&#91;0&#93; &nbsp;= 5;<br /> &nbsp; &nbsp;buf&#91;1&#93; &nbsp;= 0;<br /> &nbsp; &nbsp;if&#40; send&#40;sd,&#40;char*&#41;buf,2,0&#41; &#33;= 2&#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /><br /> &nbsp; &nbsp;len &nbsp; &nbsp; = 5;<br /> &nbsp; &nbsp;WAIT_AND_RECV&#40;sd,&#40;char*&#41;buf,len,PROTO_RECVRESP_TIMEOUT,0&#41;;<br /> &nbsp; &nbsp;if&#40; len &#33;= 5 || buf&#91;0&#93; &#33;= 5 || buf&#91;1&#93; &#33;= 1 &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;处理socks5CONNECT命令失败&#58;len&#58;%d,buf&#91;0&#93;&#58;0x%x,buf&#91;1&#93;&#58;0x%x\n&#34;,len,buf&#91;0&#93;,buf&#91;1&#93;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;switch&#40; buf&#91;3&#93; &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;case 1&#58; &nbsp; &nbsp; // &nbsp;是IP地址<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;len = 5;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WAIT_AND_RECV&#40;sd,&#40;char*&#41;buf+5,len,PROTO_RECVRESP_TIMEOUT,0&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if&#40; len &#33;= 5 &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;处理socks5CONNECT命令&#91;IP方式&#93;失败&#58;len&#58;%d\n&#34;,len&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;struct in_addr &nbsp;addr;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memcpy&#40;&#40;char*&#41;&amp;addr.s_addr,buf+4,4&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;strcpy&#40;dstaddr,inet_ntoa&#40;addr&#41;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dstport = ntohs&#40;*&#40;unsigned short*&#41;&#40;buf+8&#41;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br /> &nbsp; &nbsp; &nbsp; &nbsp;case 3&#58; &nbsp; &nbsp; // &nbsp;是域方式<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;len = buf&#91;4&#93;+2;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WAIT_AND_RECV&#40;sd,&#40;char*&#41;buf+5,len,PROTO_RECVRESP_TIMEOUT,0&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if&#40; len &#33;= buf&#91;4&#93;+2 &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;处理socks5CONNECT命令&#91;域方式&#93;失败&#58;len&#58;%d\n&#34;,len&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memcpy&#40;dstaddr,buf+5,buf&#91;4&#93;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dstaddr&#91;buf&#91;4&#93;&#93; = 0;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dstport &nbsp; &nbsp; = ntohs&#40;*&#40;unsigned short*&#41;&#40;buf+5+buf&#91;4&#93;&#41;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br /> &nbsp; &nbsp; &nbsp; &nbsp;default&#58;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;处理socks5CONNECT命令&#91;&#93;失败&#58;未知方式&#58;type&#58;0x%x\n&#34;,buf&#91;3&#93;&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;return httpproxy_connect&#40;proxyaddr,proxyport,dstaddr,dstport&#41;;<br />}<br /><br />int listenport&#40;int port,const char*addr&#41;<br />{<br /> &nbsp; &nbsp;int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; len = sizeof&#40;struct sockaddr_in&#41;;<br /> &nbsp; &nbsp;struct sockaddr_in &nbsp;bindaddr;<br /><br /> &nbsp; &nbsp;int &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= socket&#40;AF_INET,SOCK_STREAM,0&#41;;<br /> &nbsp; &nbsp;if&#40; sd == -1&#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /><br /> &nbsp; &nbsp;memset&#40;&amp;bindaddr,0,len&#41;;<br /> &nbsp; &nbsp;bindaddr.sin_family &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = AF_INET;<br /> &nbsp; &nbsp;bindaddr.sin_port &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = htons&#40;port&#41;;<br /> &nbsp; &nbsp;if&#40; addr &amp;&amp; addr&#91;0&#93; &#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;bindaddr.sin_addr.s_addr &nbsp; &nbsp;= inet_addr&#40;addr&#41;;<br /><br /> &nbsp; &nbsp;if&#40; bind &#40; sd,&#40;struct sockaddr*&#41;&amp;bindaddr,&amp;len&#41; || listen&#40;sd,100 &#41;&#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;打开端口失败,port&#58;%d\n&#34;,port&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;CLOSESOCKET&#40;sd&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return -1;<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;return sd;<br />}<br /><br />void running&#40;int sd&#41;{<br /> &nbsp; &nbsp;int ad;<br /> &nbsp; &nbsp;if&#40; sd == -1 &#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;return;<br /><br /> &nbsp; &nbsp;while&#40;1&#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp;int proxyid;<br /> &nbsp; &nbsp; &nbsp; &nbsp;char &nbsp; &nbsp;buf&#91;10240&#93;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;int &nbsp; &nbsp; len;<br /> &nbsp; &nbsp; &nbsp; &nbsp;int &nbsp; &nbsp; maxid;<br /> &nbsp; &nbsp; &nbsp; &nbsp;int &nbsp; &nbsp; actcount;<br /><br /> &nbsp; &nbsp; &nbsp; &nbsp;ad &nbsp;= accept&#40;sd,NULL,NULL&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;if&#40; ad == -1 &#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br /><br /> &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;有客户连接,id&#58;%d\n&#34;,ad&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp;if&#40;&#40;proxyid = socks5_accept&#40;ad,&#34;172.16.68.21&#34;,80&#41;&#41; == -1 &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CLOSESOCKET&#40;ad&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;continue;<br /> &nbsp; &nbsp; &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;进行代理转发工作<br /> &nbsp; &nbsp; &nbsp; &nbsp;maxid &nbsp; = ad &#62; proxyid? ad&#58;proxyid;<br /> &nbsp; &nbsp; &nbsp; &nbsp;while&#40; ad &#62; -1 &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;struct timeval &nbsp;waittime &nbsp; &nbsp;= {10,0};<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;struct fd_set &nbsp; sset;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FD_ZERO&#40;&amp;sset&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FD_SET&#40;ad,&amp;sset&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FD_SET&#40;proxyid,&amp;sset&#41;;<br /><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;actcount = select&#40;maxid+1,&amp;sset,NULL,NULL,&amp;waittime&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while&#40;actcount &#62; 0 &#41;{<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int actid &nbsp; = FD_ISSET&#40;proxyid,&amp;sset&#41;?proxyid&#58;ad;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int sendid &nbsp;= actid == ad? proxyid&#58;ad;<br /><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FD_CLR&#40;actid,&amp;sset&#41;;<br /> &nbsp; &nbsp;len = sizeof&#40;buf&#41;-1;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WAIT_AND_RECV&#40;actid,buf,len,10,0&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if&#40; len &#62; 0 &#41;{<br /> &nbsp; &nbsp;        buf&#91;len&#93; = 0;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;send&#40;sendid,buf,len,0&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;%d接口活动,内容为&#58;%s\n&#34;,actid,buf&#41;;<br /> &nbsp; &nbsp;}<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else{<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;接收失败,id&#58;%d\n&#34;,actid&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CLOSESOCKET&#40;ad&#41;;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ad &nbsp;= -1;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;actcount --;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;某一方已经关闭,继续下一组转发<br /> &nbsp; &nbsp; &nbsp; &nbsp;CLOSESOCKET&#40;proxyid&#41;;<br /> &nbsp; &nbsp;}<br /> &nbsp; &nbsp;CLOSESOCKET&#40;sd&#41;;<br />}<br /><br />main&#40;&#41;{<br /> &nbsp; &nbsp;int ld;<br /> &nbsp; &nbsp;INIT_SOCKET&#40;&#41;;<br /> &nbsp; &nbsp;ld &nbsp;= listenport&#40;1080,NULL&#41;;<br /> &nbsp; &nbsp;if&#40; ld &#33;= -1&#41;<br /> &nbsp; &nbsp; &nbsp; &nbsp;running&#40;ld&#41;;<br /> &nbsp; &nbsp;else<br /> &nbsp; &nbsp; &nbsp; &nbsp;DEBUG_DUMP&#40;&#34;监听失败\n&#34;&#41;;<br /> &nbsp; &nbsp;CLEAN_SOCKET&#40;&#41;;<br />}<br /><br /><!--c2--></div><!--ec2-->

2004-6-5 10:43 无双
http及socks5代理只是在CONNECT时进行协商<br />后面的操作不需要附加的信息<br />同时代理也不会对数据进行解释 只是进行转发<br /><br />这只是一个测试程序 <br /><br />可以自己使用httpproxy_connect与socks5_accept来实现自己的代理转换程序<br /><br />另外在flashfxp上测试成功 <br /><br />在foxmail上还没有测试成功 <br /><br />主要函数说明<br />httpproxy_connect<br />通过http代理创建到目标机器的连接 <br /><br />socks5_accept<br />接收socks5连接请求,并把它转换成http代理,<br />创建http代理通道成功后返回http代理通道的socketid <br /><br />以上两个失败都返回-1<br /><br />创建成功后<br />客户端 &lt;-数据--&#62;socks5 sd &lt;---数据---&#62;http proxy sd&lt;----&#62;目标

2006-3-7 04:48 wanghi
好!顶一个!

2006-3-24 09:34 wuhu
太长了吧,现在最讨厌看code了,wushuang兄,最好能
用文字和图形的方法表达出来,我想这样是比较好的,
code嘛,就给新人练练手吧,嘿嘿!(建议)

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.