C 套接字保持关闭等待状态

C 套接字保持关闭等待状态,c,windows,wininet,C,Windows,Wininet,我正在使用Wininet在应用程序启动时对服务器执行检查 问题是,在调用CloseInternetHandle之后,套接字的状态仍然是CLOSE\u WAIT,就像在netstat上看到的那样,最糟糕的是它从未改变它的状态 下面是我正在使用的简单代码。我做错了什么 hInternet = InternetOpen(NULL, INTERNETOPENTYPEPRECONFIG, NULL, NULL, 0); if (hInternet) { hFile = In

我正在使用Wininet在应用程序启动时对服务器执行检查

问题是,在调用CloseInternetHandle之后,套接字的状态仍然是CLOSE\u WAIT,就像在netstat上看到的那样,最糟糕的是它从未改变它的状态

下面是我正在使用的简单代码。我做错了什么

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建立大量连接,这将对性能产生一定影响。

在声明它“从未”更改之前,您要等待多长时间?应用程序是否正在运行或调试器是否已暂停?CLOSE_WAIT表示应用程序尚未关闭套接字。但是我正在关闭它,正如您所看到的,它没有在调试器中运行。您没有关闭TCP连接。您正在关闭internet句柄。WinInet API肯定支持HTTP保持活动和连接池。暂停调试器会阻止清理。@usr它没有像我前面所说的那样在调试器中运行,如何关闭TCP连接?