将 HTTP 连接绑定到特定适配器(提示:计量连接)

Bind HTTP connection to specific adapter (Hint: Metered Connection)

Windows 8 及更高版本已设置为建立 Wi-Fi(和其他)连接以进行计量(并附加费用,但此处无关紧要)。我已使用 Native Wi-Fi API and WCM APIs 查找所需信息。

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

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

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

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

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

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

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

所以我认为你在这方面运气不佳,unless/until Microsoft 公开了一个新的 API 来支持绑定 WinInet/WinHTTP 会话,或者以其他方式公开对 SOCKET 再处理一下。