最近在寫一個基於Socket的MFC程式,要求用戶端可以使用HTTP代理來串連到服務端。網上查了一堆資料,居然沒看到幾個好的,是我尋找方式有誤嗎>_<。誰有現成封裝好的包給我一個吧。 總之,整理了下一堆資料,再改了網上幾個例子(主要是“HTTP 隧道 (HTTP代理Socket客戶)”這篇,其實我也就把那裡面的CSocket改成SOCKET了),搞出下面這堆東西。 SOCKET socketsend=socket(AF_INET,SOCK_STREAM,0);//建立Socket SOCKADDR_IN ToAddr; int comm=proxyip.Find(':'); //proxyip格式為ip:port ToAddr.sin_addr.S_un.S_addr=inet_addr(proxyip.Left(comm)); ToAddr.sin_family=AF_INET; proxyip=proxyip.Mid(comm+1); ToAddr.sin_port=htons(atoi(proxyip)); int retErr=connect(socketsend,(SOCKADDR*)&ToAddr,sizeof(ToAddr)); if(retErr==SOCKET_ERROR) { AfxMessageBox("connect error"); return 0; } char tmpBuffer[40]; memset(tmpBuffer,0,40); CString temp; //ipaddress為需要已連線的服務端的ip,port為服務端連接埠 temp.Format("CONNECT %s:%s HTTP/1.1/r/nUser-Agent: MyApp/0.1/r/n/r/n",ipaddress,port); send(socketsend,temp.GetBuffer(temp.GetLength()),temp.GetLength(),0); recv(socketsend,tmpBuffer,40,0); char *tmp=strchr(tmpBuffer,' '); char flag[4]; for(int i=0;i<3;i++) flag[i]=tmp[i+1]; flag[4]='/0'; if(strcmp(flag,"200")!=0) { AfxMessageBox("fail to connect proxy!/n"); return 0; } return 1; 到這裡Proxy 伺服器就串連成功了,然後就可以直接用上面的socketsend來發送和接受資料。 比如: send(socketsend,"try to send some words",128,0); recv(socketsend,buf,128,0); 這個是 阻塞模式的例子,用的windows的api,大家將就看一下吧,誰有非阻塞模式的麻煩發我一個…… 其實整個過程非常簡單,就是: 1.connectProxy 伺服器 2.發送一個包,格式為:CONNECT ip:port HTTP/1.1/r/nUser-Agent: MyApp/0.1/r/n/r/n 這裡的ip和port是你真正需要已連線的服務器的ip和連接埠。 3.接受伺服器的回應,如果回應裡帶有“HTTP/1.X 200 ”的字樣,就表示串連成功。以後你就可以用這個socket直接發送資料了。 本文出自 “落葉松” 部落格,請務必保留此出處http://larch.blog.51cto.com/277889/51991 本文出自 51CTO.COM技術部落格 |