我正在使用Wininet在应用程序启动时对我的服务器进行检查。
问题是在调用CloseInternetHandle之后,套接字状态仍然是netstat上看到的CLOSE_WAIT,最糟糕的是它永远不会改变状态。
这是我正在使用的简单代码。我做错了什么?
hInternet = InternetOpen(NULL, INTERNETOPENTYPEPRECONFIG, NULL, NULL, 0);
if (hInternet)
{
hFile = InternetOpenUrl(hInternet, url, NULL, 0, INTERNETFLAGRELOAD, 0);
InternetReadFile(hFile, &buffer, 20, &btsRead);
InternetCloseHandle(hFile);
InternetCloseHandle(hInternet);
}
答案 0 :(得分:2)
WinInet试图在可能的地方重用套接字,因此即使你释放句柄,它也可以选择保持套接字处于活动状态,为下一次调用InternetOpen做好准备。大多数时候这是一件好事,你不必担心它。
这不是手柄泄漏。如果将代码放在循环中并查看netstat中的本地端口号,则可以看到这一点:同一个套接字被反复重用。当您的进程完成时,WinInet将正确关闭套接字。
如果您真的需要立即关闭它,您可以通过在最终的InternetCloseHandle之后调用InternetSetOption来欺骗WinInet:
...
InternetCloseHandle(hInternet);
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
执行此操作告诉WinInet全局WinInet设置已更改(例如在注册表中),因此它别无选择,只能关闭所有套接字并重置自身。但是,这显然不是预期的用途,如果您与WinInet建立了大量连接,将会对性能产生影响。