Socket通过HTTP代理发送数据

        最近在写一个基于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;
到这里代理服务器就连接成功了,然后就可以直接用上面的socketsend来发送和接受数据。
比如:
send(socketsend,"try to send some words",128,0);
recv(socketsend,buf,128,0);
  
这个是 阻塞模式的例子,用的windows的api,大家将就看一下吧,谁有非阻塞模式的麻烦发我一个……
其实整个过程非常简单,就是:
1.connect代理服务器
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直接发送数据了。
 

你可能感兴趣的:(代理,网络,socket,职场,休闲)