3

我调用wininet\InternetOpenUrlA,然后调用 wininet\InternetReadFile ,完成后我调用wininet\InternetCloseHandle,它返回 True。这意味着句柄已成功关闭,但连接仍处于已建立状态。

为什么我调用 wininet\InternetCloseHandle 时连接没有关闭?

4

2 回答 2

4

WinInet 可以为将来对同一服务器的请求缓存和重用连接。

于 2013-07-31T19:22:18.087 回答
4

WinInet 尝试在可能的地方重用套接字,因此即使您释放句柄,它也可以选择保持套接字处于活动状态,为下一次调用 InternetOpen 做好准备。大多数情况下,这是一件好事,您无需担心。

如果你真的需要立即关闭它,你可以通过在你的最终 InternetCloseHandle 之后调用 InternetSetOption 来欺骗 WinInet 这样做:

...
InternetCloseHandle(hInternet);
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);

这样做会告诉 WinInet 全局 WinInet 设置已更改(例如在注册表中),因此它别无选择,只能关闭所有套接字并自行重置。但是,这显然不是预期的用途,如果您与 WinInet 建立大量连接,则会对性能产生一些影响。

于 2014-08-12T11:22:20.670 回答