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

时间:2016-08-17 09:40:59

标签: c++ c windows winapi winhttp

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

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

执行此操作

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

所以我认为你没有运气,除非/直到微软公开新API以支持绑定WinInet / WinHTTP会话,或以其他方式再次公开对SOCKET句柄的访问。