最近看到很多人问关于穿越网关的问题,我找到了一篇相关内容的文章,翻译过来给大家分享。如果有错误望给大家来更正
HTTP隧道:HTTP是一种基于文本的协议,通过浏览器取得网页。但是,如果你使用局域网连接,或者说你在代理服务器的后面。代理服务器上某个端口运行代理进程。在你的IE连接选项中,你可以设定局域网设置。这个代理服务器当然也运行在基于文本的协议,你只能从外部网络取得HTTP相关的数据。这就是一个缺点。你能够通过HTTP连接到外部,取得那些你想通过2进制协议取得的数据,甚至是你自己的协议。这是通过HTTPS实现的解释一下HTTPS在HTTPS中,数据在浏览器和服务器之间是通过一个安全的方式传输。它是二进制的协议。当它通过代理服务器,代理服务器并不清楚这是什么。服务器就打开允许二进制流是服务器和客户机交换数据。现在我们就可以愚弄代理服务器并且和任何服务器交换数据。而代理服务器会认为我们是在进行安全的HTTP会话。对于HTTPS,你的浏览器连接到代理服务器使用这样的命令:CONNECT xxxxx.com:443 HTTP/1.0 <CR><LF> HOST xxxxx.com:443<CR><LF> [... other HTTP header lines ending with <CR><LF> if required]> <CR><LF> // 空行加在最后接着,代理服务器就像对待HTTP安全会话一样对待这个连接,打开一个二进制流。如果连接建立,代理服务器返回这样的信息:
HTTP/1.0 200 Connection Established<CR><LF> [.... other HTTP header lines ending with <CR><LF>.. ignore all of them] <CR><LF> // Last Empty Line
现在浏览器已经和服务器建立了连接,可以传递2进制的数据了 
怎样做???????
现在,你的程序要愚弄代理服务器并且像IE对待安全连接一样对待数据
1.连接到代理服务器. 
2.发送 CONNECT Host:Port HTTP/1.1<CR><LF>. 
3.发送 <CR><LF>. 
4.等待第一行回应. 如果包含 HTTP/1.X 200则说明连接建立成功. 
5.读取所有回应,直到接收到空行结束. 
现在你通过代理服务器连接到了外面的世界.做你想做的事吧.  
Sample Source Code // 这个例子通过25号端口连接到mail.yahoo.com 
// 通过代理服务器192.0.1.1, 端口 4480 
// CSocketClient覆盖了CSocket类 
// 当你使用<< 操作 CString, 程序写入 CString 
// SOCKET使用CRLF结束 
// 当你使用>> 操作 CString, 程序接收 
// 一行回应,直到收到 CRLF 
try { 
CString Request,Response;
CSocketClient Client; 
Client.ConnectTo("192.0.1.1",4480); 
// Issue CONNECT Command 
Request = "CONNECT mail.yahoo.com:25 HTTP/1.0"; 
Client<<Request; // Issue empty line 
Request = ""; 
Client<<Request; // Receive Response From Server 
Client>>Response; // Ignore HTTP Version 
int n = Response.Find(' '); 
Response = Response.Mid(n+1); // Http Response Must be 200 only 
if(Response.Left(3)!="200") 
{ // Connection refused from HTTP Proxy Server 
AfxMessageBox(Response); } // Read Response Lines until you receive an empty line. 
do 
{ Client>>Response;
 if (Response.IsEmpty()) break;
 }while (true); // Coooooooool.... Now connected to mail.yahoo.com:25 // Do further SMTP Protocol here.. } 
catch (CSocketException * pE) 
{ pE->ReportError(); } Library Source CodeDns.h 文件包含DNS相关的源码. 以调用其它库SocketEx.h, SocketClient.h和NeuroBuffer.h.CSocketExSocket 
相当于一个外覆类. (CSocket比较笨重而且不可靠如果你不知道他怎样工作.) 所有函数和CSocket一样,你可以直接使用这些函数。CSocketClient继承自CSocketEx并且可以抛出Winsock定义的各种错误.它定义了两个操作符 >> 和<<, 用于简单的接收和发送; 并且可以改变字节的顺序。CHttpProxySocketClient
继承自CSocketClient,你可以调用SetProxySettings(ProxyServer,Port)方法设置代理服务器.然后你可以连接到任何你想要的IP和端口. ConnectTo方法被覆盖,日阿可以自动实现HTTP代理协议并返回给你一个连接 怎样使用CHttpProxySocketClient 
// e.g. You need to connect to mail.yahoo.com on port 25
  // Through a proxy on 192.0.1.1, on HTTP Proxy 4480
  // CSocketClient is Socket wrapping class
  // When you apply operator << on CString, it writes CString
  // To Socket ending with CRLF
  // When you apply operator >> on CString, it receives
  // Line of response from socket until CRLF
  try
  {
    CHttpProxySocketClient Client;    Client.SetProxySettings("192.0.1.1",1979);    // Connect to server mail.yahoo.com on port 25
    Client.ConnectTo("mail.yahoo.com",25);    // You now have access to mail.yahoo.com on port 25
    // If you do not call SetProxySettings, then
    // you are connected to mail.yahoo.com directly if
    // you have direct access, so always use
    // CHttpProxySocketClient and no need to do any
    // extra coding.  }
  catch(CSocketException * pE) {
    pE->ReportError();
  }
 Note: 我不习惯于把.h和.cpp当作不同的文件来对待,因为下次使用它们会产生问题,你必须把它们全都移动过去。所以我把所有代码放进.h中。我不写.cpp,除非需要你只需要Copy SocketEx.h, SocketClient.h, HttpProxySocket.h 到你的目录中,然后使用 #include "HttpProxySocket.h"放在之后
#if !defined(.....
不要放置其它的代码,否则会长生大量错误 Akash Kava April 21, 2003  
PS::::::第一次做翻译,难免有错误咯,望高手们赐教另外还有原代码,Contact我呀Email:[email protected]

解决方案 »

  1.   

    希望对大家有所帮助。跟帖跟帖噢!!!!!
    http://blog.csdn.net/yhqs540/
      

  2.   

    大家有没有通过HTTP代理实现客户 服务器对话的例子
      模拟两边发消息的那种
      

  3.   

    粗粗看了一下,没看懂是干啥隧道的话,client-http编码--网关-http解码-server就行编码解码看rfc就行……over
      

  4.   

    你只能从外部网络取得HTTP相关的数据。这就是一个缺点。你能够通过HTTP连接到外部,取得那些你想通过2进制协议取得的数据,甚至是你自己的协议。这是通过HTTPS实现的--------------------------------------------------------HTTP协议不能获取2进制数据吗?用FLASHGET下载东西的时候,获取的不是2进制数据吗?其实要用HTTP协议来穿防火墙,就模仿一下FLASHGET下载文件就OK了,除非不允许用HTTP协议,
    何必大动干戈用HTTPS?效率会低很多
      

  5.   

    急,有这方面的专家吗,请与我联系,好处多多!MSN:[email protected]
      

  6.   

    想把http 代理转化成sock代理 以前看过这样的软件,不知道是怎么实现的,大侠指点,谢谢!!!
      

  7.   

    先收一下 msn :[email protected]
      

  8.   

    现在的很多http代理都有认证,所以写出这些只做了%10的工作,还有什么Basic,Digest,NTLM,MSN,Negotiate,Kerberos,SSL等的认证工作这才是最重要的
      

  9.   

    认真看完一本TCP/IP原理上面的问题就解决了,楼上说的问题才是麻烦,因为资料少,会的人也少。很多流行软件都没有支持很多常用的认证方式。
      

  10.   

    to zbplusplus(于是开始苏鲁之的堕落(抵制日货)) 
    其实此问题也不难,多看看相关的文档,什么QQ,popo等实现了basic,NTLM认证,我自己实现了basic,NTLM,Digest,MSN等认证