【问题标题】:Bind HTTP connection to specific adapter (Hint: Metered Connection)将 HTTP 连接绑定到特定适配器(提示:计量连接)
【发布时间】:2016-08-17 09:40:59
【问题描述】:

Windows 8 及更高版本已设置为对 Wi-Fi(和其他)连接进行计量(并附带费用,但此处无关紧要)。我使用了Native Wi-Fi APIWCM APIs 来查找所需的信息。

使用套接字,可以绑定、有选择地发送和忽略来自/到计量连接的传入数据包。但是,如何使用WinHTTP APIs 做到这一点?

StackOverflow 和SuperUser 上的一些答案建议使用 ForceBindIP,但我们不能简单地使用它。

如果 MS Windows 已经实现了计量连接,理想情况下应该有一些方法来指示 WinHTTP 服务不要使用特定的连接。

【问题讨论】:

  • “如果 MS Windows 实现了计量连接,则必须有某种方法来指示 WinHTTP 服务不使用特定连接。” - 为什么?
  • @IInspectable,以便应用程序可以限制计量连接上的 HTTP 数据使用。今天,大多数流量都在 HTTP 上。例如,Outlook 是愚蠢的,它只会在任何网络被计量时警告用户。这可能是操作系统没有此功能。浏览器也无法通过给定的适配器限制其网络流量。
  • 这就解释了为什么你认为应该有办法。它没有解释为什么你认为必须有办法。我认为限制计量连接上的 HTTP 数据使用也不是一个有用的设置。无论协议如何,限制任何流量都是合理的。
  • "我无法从 HINTERNET 句柄中获取套接字句柄" - 实际上,你可以。使用InternetQueryOption() 有一个INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO 选项,它返回一个包含SOCKET 句柄的INTERNET_DIAGNOSTIC_SOCKET_INFO 结构。
  • @RemyLebeau,感谢您的提示。但是,我发现此选项不适用于 Windows 7 及更高版本。我会尝试使用 WinHttp 回调并尝试从那里绑定到特定的适配器。

标签: c++ c windows winapi winhttp


【解决方案1】:

不幸的是,WinInet 和 WinHTTP 本身都不支持您的要求。

您可能不得不求助于使用 WinSock API bind() 函数来手动将 WinInet/WinHTTP 会话套接字绑定到所需的网络连接。

在 Windows 7 之前,您可以通过使用 InternetQueryOption()INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO 选项从 HINTERNET 句柄获取 SOCKET 句柄。它使用有关连接的信息填充INTERNET_DIAGNOSTIC_SOCKET_INFO 结构,包括实际的SOCKET 句柄。

但是,Windows 7 及更高版本不再支持此选项。虽然可以通过一些额外的工作手动追踪SOCKET 句柄,但我认为这对您没有任何好处。套接字在尝试连接到服务器之前需要与bind() 绑定。 WinInet/WinHTTP 提供的可用于寻找SOCKET 句柄的相关信息在连接尝试进行之前不可用。就在连接之前,该信息还没有在 TCP 路由表中。并且一个连接了,重新绑定socket已经来不及了。

所以我认为你在这方面不走运,除非/直到微软公开一个新的 API 来支持绑定 WinInet/WinHTTP 会话,或者以其他方式再次公开对 SOCKET 句柄的访问。

【讨论】:

    猜你喜欢
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多