我正在使用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);
}
最佳答案 WinInet试图在可能的地方重用套接字,因此即使你释放句柄,它也可以选择保持套接字处于活动状态,为下一次调用InternetOpen做好准备.大多数时候这是一件好事,你不必担心它.
它不是手柄泄漏.如果将代码放在循环中并查看netstat中的本地端口号,则可以看到这一点:同一个套接字被反复重用.当您的进程完成时,WinInet将正确关闭套接字.
如果您确实需要立即关闭它,您可以通过在最终的InternetCloseHandle之后调用InternetSetOption来欺骗WinInet:
...
InternetCloseHandle(hInternet);
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
这样做告诉WinInet全局WinInet设置已经改变(例如在注册表中),所以它别无选择,只能关闭所有套接字并自行重置.但是,这显然不是预期的用途,如果您与WinInet建立了大量连接,则会产生一些性能影响.