| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 编程开发 > Visual C++教程 > 文章正文 用户登录
Better fonts免费
以太网络提供200M
龙太极/100m/asp/
霞光科技50M/Htm/
苏能科技100M/FTP
悠博科技50M/FTP/
华云网络30M/FTP/
读取XML当中的HTM
再探FlashCom的HT
关于Flash+HTML实

HTTP 隧道 (HTTP代理Socket客户)           

HTTP 隧道 (HTTP代理Socket客户)

作者:佚名 来源:http://www.codeguru.com 作者: b 更新:2006-8-25 21:05:35 错误报告 我要投稿

※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 HTTP。

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 , the connection is successful.
5. Read further lines of response until you receive an empty line.
6. Now, you are connected to outside world through a proxy. Do any 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 CString
  // 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相关的源代码。 它利用了其它的库, 如SocketEx.h, SocketClient.h, 和 NeuroBuffer.h


※CSocketEx※
-------------

作为一个Socket功能的包裹(wapper)类。(如果你不是确切知道CSocket怎样工作的, 它是非常笨重和不可信的) 所有的函数根CSocket同名。 你可以直接应用这个类

※CSocketClient※
-----------------

派生自CSocketEx, 并且根据详细的Winsock错误抛出适当地例外(exceptions). 为了方便的发送和接收,它定义了两个操作符, >> 和 <<; 如果需要它也交换网络序为主机序和主机序为网络序。


※CHttpProxySocketClient※
-----------------

派生自CSocketClient, 你可以调用SetProxySettings(ProxyServer, Port) 方法和做代理设置。 接下来, 你可以连接到你想要的主机和端口。ConnnectTo 方法被覆盖, 它自动的实现了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();
  }


【bugfree译注】
    作者在它的文章中, 说了为什么不用.h .cpp风格编程的理由, 这个我也给出我的理由, 因为
    他的风格不可取, 大家有机会可以读读它的源代码, 有两个缺点,
    (一)整体感觉乱,不清爽, 对常常的一个类很难一下子从整体上把握。 
    (二)随着代码的增加, 编译时间过长也显现出来, 可能大家都知道.h .cpp的好处之一就是
         .cpp的代码之编译一次, 假如你没有改动该.cpp文件的内容, 此文件就不会重编译。
         还有, 这样你的类接口非常清楚, 只需在模块间共享类的.h文件即可。

文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。