您的位置:首页 > 理论基础 > 计算机网络

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

2009-05-27 17:58 323 查看
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。/article/7282453.html
最近在写一个基于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直接发送数据了。

本文出自 “落叶松” 博客,请务必保留此出处/article/7282453.html
本文出自 51CTO.COM技术博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: