socks5協(xié)議轉(zhuǎn)http協(xié)議源碼_第1頁
socks5協(xié)議轉(zhuǎn)http協(xié)議源碼_第2頁
socks5協(xié)議轉(zhuǎn)http協(xié)議源碼_第3頁
socks5協(xié)議轉(zhuǎn)http協(xié)議源碼_第4頁
socks5協(xié)議轉(zhuǎn)http協(xié)議源碼_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

socks5代理可以看rfc1928socks5的用戶名口令認(rèn)證方法看rfc1929http代理可以看rfc2616socks5代理可以支持tcp和udp而http只支持tcp所以這個(gè)代理轉(zhuǎn)換器只支持tcp寫作原因很多軟件都有socks5認(rèn)證方法但是它們不支持http認(rèn)證方法而從原理上可以使用http認(rèn)證方法(因?yàn)樗鼈儧]有使用udp)所以寫這個(gè)軟件可以方便的使其它程序可以使用http代理如聯(lián)眾或是foxmailCODE#include<winsock2.h>#include<stdio.h>#include<stdlib.h>#defineINIT_SOCKET(){WSADATAwsadata;WSAStartup(MAKEWORD(2,2),&wsadata);}#defineCLOSESOCKET(x)closesocket(x)#defineCLEAN_SOCKET(){WSACleanup();}//http.c實(shí)現(xiàn)http代理功能#definePROTO_EXCHANGE_TIMEOUT15#definePROTO_RECVRESP_TIMEOUT75#definePROTO_SENDRESP_TIMEOUT10#defineWAIT_AND_RECV(sd,buf,len,waittime,recvflags)do{\structfd_setsset;\structtimevalwaited;\waited.tv_sec=waittime;waited.tv_usec=0;\FD_ZERO(&sset);FD_SET(sd,&sset);\if(select(sd+1,&sset,NULL,NULL,&waited)!=1||(len=recv(sd,buf,len,recvflags))==-1)\len=-1;\}while(0);#defineDEBUG_DUMPprintfstaticinthttpproxy_connect(constchar*proxyaddr,intproxyport,constchar*dstaddr,intdstport){intproxysd=-charbuf[2048];intlen;char*ptoken;intstatus;

structsockaddr_ininaddr;if(!proxyaddr||!proxyaddr[0]||proxyport<1||!dstaddr||!dstaddr[0])return-1;DEBUG_DUMP("代理:%s:%d,目標(biāo):%s:%d\n",proxyaddr,proxyport,dstaddr,dstport);len=sizeof(inaddr);memset(&inaddr,0,len);if((inaddr.sin_addr.s_addr=inet_addr(proxyaddr))==INADDR_NONE)return-1;inaddr.sin_familyinaddr.sin_portinaddr.sin_familyinaddr.sin_port=AF_INET;=htons(proxyport);//connecttoproxyif((proxysd=socket(AF_INET,SOCK_STREAM,0))==-1)return-1;if(connect(proxysd,(structsockaddr*)&inaddr,len))gotoerrorparse;//發(fā)送connect請求并判斷返回,根據(jù)HTTP協(xié)議說明,詳細(xì)內(nèi)容請看RFC2616//HTTP代理使用CONNECT指令實(shí)現(xiàn),CONNECT時(shí)指定選端的地址與端口號,//當(dāng)代理服務(wù)器返回成功后(狀態(tài)值是2xx),后面的代理服務(wù)器不再對此連接的數(shù)據(jù)//進(jìn)行HTTP協(xié)議處理if(dstport>0)len=sprintf(buf,"CONNECT%s:%dHTTP/1.1\r\n\r\n",dstaddr,dstport);elselen=sprintf(buf,"CONNECT%sHTTP/1.1\r\n\r\n",dstaddr);if(send(proxysd,buf,len,0)!=len){DEBUG_DUMP(“發(fā)送CONNECT請求失敗:包內(nèi)容:%s\n",buf);gotoerrorparse;}len=sizeof(buf)-1;WAIT_AND_RECV(proxysd,buf,len,PROTO_RECVRESP_TIMEOUT,MSG_PEEK);if(len==-1){DEBUG_DUMP("接收CONNECT響應(yīng)失敗\n");gotoerrorparse;}buf[len]=0;DEBUG_DUMP("CONNECT響應(yīng)為:%s|\n",buf);if(strnicmp(buf,"HTTP/1.",7)||(!strstr(buf,"\r\n\r\n")&&!strstr(buf,"\n\n")))gotoerrorparse;ptoken=buf;while(!isspace(*ptoken)&&*ptoken)ptoken++;status=atoi(ptoken);if(status<300&&status>199){ptoken=strstr(buf,"\r\n\r\n");if(ptoken)len=ptoken-buf+4;else{ptoken=strstr(buf,"\n\n");len=ptoken-buf+2;}WAIT_AND_RECV(proxysd,buf,len,PROTO_RECVRESP_TIMEOUT,0);returnproxysd;}errorparse:CLOSESOCKET(proxysd);return-1;}//sd[in]使用socks5的客戶端的連接id//proxyaddr[in]http代理地址//proxyport[in]http代理端口//return://-1失敗// >=0與http代理的連接idstaticintsocks5_accept(intsd,constchar*proxyaddr,intproxyport){unsignedcharbuf[512];int len=2;int i=0;char dstaddr[260];int dstport;if(!proxyaddr||!proxyaddr[0]||proxyport<1)return-1;//處理協(xié)商,現(xiàn)在只處理無認(rèn)證情況,無論對方會不會處理這種情況//沒有要求無認(rèn)證方式,sorry,那我就不理它//另外只處理SOCKS5的CONNECT命令,其它不處理WAIT_AND_RECV(sd,(char*)buf,len,PROTO_EXCHANGE_TIMEOUT,0);if(len!=2||buf[0]!=5){DEBUG_DUMP("接收socks5協(xié)商包失敗,len:%d,buf[O]:%d\n",len,buf[O]);return-1;}len=buf[1];i=len;WAIT_AND_RECV(sd,(char*)buf,i,PROTO_EXCHANGE_TIMEOUT,0);if(len!=i){DEBUG_DUMP(“接收socks5協(xié)商包失敗,想接收%4,收到:%d\n",len,i);return-1;}for(i=0;i<len&&buf[i];i++);if(i==len){DEBUG_DUMP("用戶沒有請求socks5無認(rèn)證方法:\n");return-1;}buf[0]=5;buf[1]=0;if(send(sd,(char*)buf,2,0)!=2)return-1;len=5;WAIT_AND_RECV(sd,(char*)buf,len,PROTO_RECVRESP_TIMEOUT,0);if(len!=5||buf[0]!=5||buf[1]!=1){DEBUG_DUMP("處理socks5CONNECT命令失敗:len:%d,buf[O]:Ox%x,buf[l]:Ox%x\n",len,buf[O],buf[l]);return-1;}switch(buf[3]){case1: //是IP地址len=5;WAIT_AND_RECV(sd,(char*)buf+5,len,PROTO_RECVRESP_TIMEOUT,0);if(len!=5){DEBUG_DUMP("處理socks5CONNECT命令[IP方式]失敗:len:%d\n",len);return-1;}{structin_addraddr;memcpy((char*)&addr.s_addr,buf+4,4);strcpy(dstaddr,inet_ntoa(addr));dstport=ntohs(*(unsignedshort*)(buf+8));}break;case3: //是域方式len=buf[4]+2;WAIT_AND_RECV(sd,(char*)buf+5,len,PROTO_RECVRESP_TIMEOUT,0);if(len!=buf[4]+2){DEBUG_DUMP("處理socks5CONNECT命令[域方式]失敗:len:%d\n",len);return-1;

}memcpy(dstaddr,buf+5,buf[4]);dstaddr[buf[4]]=0;dstport=ntohs(*(unsignedshort*)(buf+5+buf[4]));break;default:DEBUG_DUMP("處理socks5CONNECT命令[]失敗:未知方式:type:0x%x\n",buf[3]);return-1;}returnhttpproxy_connect(proxyaddr,proxyport,dstaddr,dstport);}intlistenport(intport,constchar*addr){int len=sizeof(structsockaddr_in);structsockaddr_inbindaddr;int sd=socket(AF_INET,SOCK_STREAM,0);if(sd==-1)return-1;memset(&bindaddr,0,len);bindaddr.sin_familybindaddr.sin_portif(addr&&addr[0])bindaddr.sin_addr.s=AF_INET;bindaddr.sin_familybindaddr.sin_portif(addr&&addr[0])bindaddr.sin_addr.s=AF_INET;=htons(port);addr=inet_addr(addr);if(bind(sd,(structsockaddr*)&bindaddr,&len)||listen(sd,100)){DEBUG_DUMP(“打開端口失敗,port:%d\n",port);CLOSESOCKET(sd);return-1;}returnsd;}voidrunning(intsd){intad;if(sd==-1)return;while(1){intproxyid;charbuf[10240];intlen;intmaxid;intactcount;ad=accept(sd,NULL,NULL)if(ad==-1)break;DEBUG_DUMP(“有客戶連接,id:%d\n",ad);if((proxyid=socks5_accept(ad,"1",80))==-1){CLOSESOCKET(ad);continue;}//進(jìn)行代理轉(zhuǎn)發(fā)工作maxid=ad>proxyid?ad:proxyid;while(ad>-1){structtimevalwaittime={10,0};structfd_setsset;FD_ZERO(&sset);FD_SET(ad,&sset);FD_SET(proxyid,&sset);actcount=select(maxid+1,&sset,NULL,NULL,&waittime);while(actcount>0){intactid=FD_ISSET(proxyid,&sset)?proxyid:ad;intsendid=actid==ad?proxyid:ad;FD_CLR(actid,&sset);len=sizeof(buf)-1;WAIT_AND_RECV(actid,buf,len,10,0);if(len>0){buf[len]=0;send(sendid,buf,len,0);DEB

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論