【转】Socket通过HTTP代理发送数据

 

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://larch.blog.51cto.com/277889/51991

        最近在写一个基于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直接发送数据了。

 

本文出自 “落叶松” 博客,请务必保留此出处http://larch.blog.51cto.com/277889/51991

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值