最近看到很多人问关于穿越网关的问题,我找到了一篇相关内容的文章,翻译过来给大家分享。如果有错误望给大家来更正
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]
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]
解决方案 »
- 如果用selectobject()选入一个dc(HDC)的位图(HBITMAP)的尺寸大于该dc,那么多余的部分会被忽略么?比如dc像素为2×2,位图像素为3×3
- _variant_t 类型能不 能转换成CTime型的啊?在线等!
- debug版应用程序在执行动态库的afxmessagebox时提示错误,release版的一切正常
- 如何在CListCtrl中设置改变某一行的背景色或字体色
- atl的事件的问题,atl的高手救命。
- 急,急,,急,,,!!!大家来帮帮忙!
- 想做一个软件,在登陆时提示输入用户名和密码,需要用到那些函数?
- DLL里输出变量和把变量定义在共享段(pragam seg())里有什么区别?
- win2000,isapi?
- 关于鼠标的问题
- 有没有人懂CSP的?碰到一点问题,急
- 在一个SMTP程序中如何显示发件人姓名,而不是默认的发件人邮件地址
http://blog.csdn.net/yhqs540/
模拟两边发消息的那种
何必大动干戈用HTTPS?效率会低很多
其实此问题也不难,多看看相关的文档,什么QQ,popo等实现了basic,NTLM认证,我自己实现了basic,NTLM,Digest,MSN等认证