Winsock 使用系统代理设置

Posted

技术标签:

【中文标题】Winsock 使用系统代理设置【英文标题】:Winsock use system proxy settings 【发布时间】:2015-06-28 11:39:34 【问题描述】:

我有一个简单的 winsock 程序,我想通过系统代理传递我的连接。我看到了一些解释如何捕获系统代理然后发送字符串的帖子,如下所示:

CONNECT 127.0.0.1:8080 HTTP/1.0\r\n

等等。 但它并不是一直都有效。 另一方面,当使用 WinInet API( InternetOpen() 函数和 ... )时,它可以完美运行。 我需要像 WinInet 这样始终正常工作的解决方案和像 Winsocket 这样的双向功能。

【问题讨论】:

双向功能:同时发送和接收,而不是像 HTTP 协议那样的请求-响应 【参考方案1】:

没有“系统代理”之类的东西。 WinInet 的代理设置只是 WinInet 的一部分,而不是 Windows 本身(Internet Explorer 使用 WinInet,因此 WinInet 配置会影响 IE,但不会影响 WinSock)。

CONNECT 127.0.0.1:8080 HTTP/1.0\r\n\r\n 是一个连接字符串,用于通过基于 HTTP 的代理服务器建立隧道(请参阅Tunneling with HTTP CONNECT)。你连接到代理,发送CONNECT命令让它连接到目标服务器,检查响应,如果成功则可以正常与目标服务器进行双向通信,就像你直接连接到它一样。

但还有其他类型的代理,例如SOCKS。相同的概念(连接到代理,请求连接到目标,之后正常进行),但协议与 HTTP 非常不同。

使用 WinSock 编码时,您必须在自己的代码中手动实现各种代理协议,或者找第三方库为您处理。 WinSock 没有对代理的内置支持。而且您必须提前知道正在使用哪种类型的代理,以便您可以使用正确的协议。有 API 可以动态检测代理设置,或者只是要求用户提供详细信息。

【讨论】:

你的回答是正确的,但是有没有办法让wininet表现得像winsock。 行为究竟以什么方式?请更具体。 在winsock模式下,我可以随意调用recv()和send(),但在WinInet中,我必须在请求后有响应,并且服务器无法向客户端请求(连接返回) . @QCoder:我还是不明白你要问什么。但是 Winsock 的运行水平比 WinInet 低。 Winsock 在 TCP 层运行,这就是为什么它可以随心所欲地发送/接收原始数据。 WinInet 在 TCP 之上的协议层运行,这就是它基于请求/响应的原因。您可以使用InternetReadFile/Ex()InternetWriteFile() 读取/写入与这些协议相关的某些部分原始数据,但您在WinInet 中的控制级别与在Winsock 中不同。

以上是关于Winsock 使用系统代理设置的主要内容,如果未能解决你的问题,请参考以下文章

如何设置LINUX系统通过代理服务器上网

mac怎么设置网络代理

设置Windows系统的cmd命令行终端的代理

Java如何查找系统的代理设置?

如何在具有代理设置的系统中使用 charles?

如何设置代理服务器使用的JVM