枫林在线论坛精华区>>程序设计 |
[52134] 主题: HTTP 隧道 (HTTP代理Socket客户)(翻译) |
作者: leaflet (Leaf) | ||
标题: HTTP 隧道 (HTTP代理Socket客户)(翻译)[转载] | ||
来自: 218.80.*.* | ||
发贴时间: 2003年04月26日 13:00:25 | ||
长度: 5727字 | ||
标题 HTTP 隧道 (HTTP代理Socket客户) bugfree(翻译) 关键字 HTTP PROXY 出处 http://www.codeguru.com/internet/HttpProxyClient.html HTTP 隧道 (HTTP代理Socket客户) ---------------------------------------------------------------- ---------------- 这篇文章贡献自Akash kava, 翻译: bugfree/CSDN 环境: VC6 ※HTTP 隧道※ -------- HTTP是基于文本的通过浏览器检索网页的协议。 大多数情况下你躲在代理 服务器的后面,通过LAN接入互联网。 在IE的Connection Option中, 你 给出你的LAN的设置。 这个代理服务器运行着基于文本的协议, 你从它那 里可以得到外界的网络HTTP相关的数据。是的, 用HTTP通过它上面的小的 望孔可以连接到外部世界, 并用二进制协议得到你想要的数据, 或者甚 至是你的协议。 它通过HTTP。 ※HTTPS 解释※ --------- 在HTTPS中, 数据以一种安全的方式从浏览器到服务器和从服务器到浏览 器。 它是二进制的协议; 当他穿过代理时, 代理不知道是什么。 代理 仅仅允许二进制流打开, 让服务器和客户两者之间交换数据。 代理服务 器认为我们在进行某个安全的会话。 对于HTTPS, 你的浏览器连接到代理服务器,并送出一个命令 CONNECT neurospeech.com:443 HTTP/1.0 <CR><LF> HOST neurospeech.com:443<CR><LF> 【...如果需要,HTTP头部的其它行以<CR><LF>结束 】 <CR><LF> // 最后的空行 接下来, 代理服务器把它作为某个HTTP安全会话, 打开一个到需求服务 器和端口的二进制流。 如果连接确立, 代理服务器返回如下回应: HTTP/1.0 200 Connection Established<CR><LF> 【...忽略所有HTTP头部的其它行以<CR><LF>结束 ,】 <CR><LF> // 最后的空行 现在, 浏览器连接到了终端服务器, 可以用二进制和安全的方式交换数 据了。 ※怎样做这个※ ------------- 现在是你的程序任务去愚弄代理服务器, 行为如IE一样进行 Secure HTT P。 1. Connect to Proxy Server first. 2. Issue CONNECT Host:Port HTTP/1.1<CR><LF>. 3. Issue <CR><LF>. 4. Wait for a line of response. If it contains HTTP/1.X 200 , th e connection is successful. 5. Read further lines of response until you receive an empty lin e. 6. Now, you are connected to outside world through a proxy. Do a ny data exchange you want. 示例源代码 // 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 CStr ing // To Socket ending with CRLF // When you apply operator >> on CString, it receives // a Line of response from socket until 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(); } ※库源码※ ------------- 文件Dns.h包含所有所有DNS相关的源代码。 它利用了其它的库, 如Sock etEx.h, SocketClient.h, 和 NeuroBuffer.h ※CSocketEx※ ------------- 作为一个Socket功能的包裹(wapper)类。(如果你不是确切知道CSocket 怎样工作的, 它是非常笨重和不可信的) 所有的函数根CSocket同名。 你可以直接应用这个类 ※CSocketClient※ ----------------- 派生自CSocketEx, 并且根据详细的Winsock错误抛出适当地例外(excep tions). 为了方便的发送和接收,它定义了两个操作符, >> 和 &l t;<; 如果需要它也交换网络序为主机序和主机序为网络序。 ※CHttpProxySocketClient※ ----------------- 派生自CSocketClient, 你可以调用SetProxySettings(ProxyServer, Por t) 方法和做代理设置。 接下来, 你可以连接到你想要的主机和端口。C onnnectTo 方法被覆盖, 它自动的实现了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 CStr ing // 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(); } 【bugfree译注】 作者在它的文章中, 说了为什么不用.h .cpp风格编程的理由, 这个 我也给出我的理由, 因为 他的风格不可取, 大家有机会可以读读它的源代码, 有两个缺点, (一)整体感觉乱,不清爽, 对常常的一个类很难一下子从整体上把 握。 (二)随着代码的增加, 编译时间过长也显现出来, 可能大家都知 道.h .cpp的好处之一就是 .cpp的代码之编译一次, 假如你没有改动该.cpp文件的内容, 此文件就不会重编译。 还有, 这样你的类接口非常清楚, 只需在模块间共享类的.h文 件即可。 ~~~~~~~~~~~~~~~~~~~~ ※作者已于 2003-04-26 13:04:45 修改本文※ ~~~~~~~~~~~~~~~~~~~~ |
||
========== * * * * * ==========
|
返回 |