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