如何通过代理服务器环境获取非标准服务?

时间:2010-06-08 07:03:07

标签: c++ c windows communication wininet

我不知道今天的代理服务器可以扮演什么样的角色,我正在学习,所以对我很轻松:-)我有一个客户端/服务器系统我用自己开发的协议编写并需要增强客户端,以便在代理环境中进行协商。

我有一个用C和C ++编写的现有客户端和服务器系统,用于处理用户界面的速度和少量MFC。我已经在Windows上编写了系统的服务器端和客户端(我工作的人主要是使用Windows的Web开发人员 - 不是一个选择)坚持使用Berkeley套接字,因为它是通过wsock32来提高效率的。客户端通过非标准端口连接到服务器(即使使用端口80是退出某些环境但是通过它的协议不是HTTP的选项)。在客户参与实时会议期间,TCP连接保持打开状态。

我们的客户群正在扩展到各种网络环境。通过添加通过端口443安全连接和使用安全套接字的能力,我已经能够解决许多问题,这使得协议能够通过很多环境,因为内部数据包无法被嗅探。但是我们的客户越来越多地落后于代理服务器环境,而我的直接连接并没有完成。我的旧学校对代理服务器的理解是,它们充当HTTP上外部HTML内容的代理,可能在本地缓存流行的材料以加快本地访问速度,并允许其IT人员将某些目标站点列入黑名单。客户抱怨我的软件无法识别并轻松浏览其代理环境,但我发现很难确定我的“最适合”解决方案应该是什么。我的软件在每个客户端请求之后都不会断开连接,并且最重要的是,数据包可以随时来自任何一方,基本上是针对特定利基的典型自定义客户端/服务器系统。

我的第一反应是“为什么他们不能只将我的服务器地址添加到他们的白名单”,但如果有一种程序化的方式我可以通过而不需要他们的IT人员帮助它在政治上更好,可以说是更好的解决方案无论如何。另外,也许我还没有理解代理服务器和环境现在已经成长的角色和目的。

我首次尝试解决方案是使用WinInet及其各种代理功能,通过端口80与我的非标准协议服务器建立连接(知道足以识别和回答简单的HTTP外观GET请求并回答它使用简单的HTTP响应页面来绕过一些采用初始数据包嗅探(DPI)的环境。我检索了WinInet的HINTERNET请求对象后面的实际SOCKET句柄,并希望用它代替我的软件现有的SOCKET连接,并希望不需要在客户端更改更多。它最初似乎是我的解决方案,但在进一步检查时,似乎操作系统获得了第一次接收此套接字上的数据的机会,因为当我通过套接字上的标准select(...)语句通知事件并查询通过ioctlsocket可用的数据大小调用成功,但返回0字节可用,读取不起作用,并从那里下坡。

有人能告诉我一个客户端库(商业广告好)会让我通过这些代理服务器环境,尽可能少的用户和IT人员帮助吗?从我读到的它已经超过SOCKS,我认为有人必须在我面前解决这个问题。

感谢您阅读我冗长的问题,

Ripred

1 个答案:

答案 0 :(得分:2)

如果您的软件可以在端口443上建立SSL连接,那么您就可以在99%的位置进行SSL连接。

通常,HTTP代理设置为代理SSL-on-443(出于HTTPS的目的)。您只需要教您的软件使用HTTP代理。查看HTTP RFC以获取完整详细信息,但Cliffs Notes版本为:

  • 连接到代理端口上的HTTP代理;
  • 发送给代理:

 CONNECT your.real.server:443 HTTP/1.1\r\n
 Host: your.real.server:443\r\n
 User-Agent: YourSoftware/1.234\r\n
 \r\n
  • 然后解析代理响应,该响应将以HTTP状态代码开头,后跟HTTP标头,后跟空行。然后,您将与目的地交谈(如果状态代码表示成功,则无论如何),并且可以开始谈论SSL。

在许多企业环境中,您必须使用代理进行身份验证 - 这几乎总是HTTP基本身份验证,这非常简单 - 再次参见RFC。