套接字仍处于CLOSE_WAIT状态

我正在使用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建立了大量连接,则会产生一些性能影响.

点赞