gpt4 book ai didi

c - 套接字保持在 CLOSE_WAIT 状态

转载 作者:可可西里 更新时间:2023-11-01 14:18:17 24 4
gpt4 key购买 nike

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

问题是在调用 CloseInternetHandle 之后套接字状态仍然是 CLOSE_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 建立大量连接,将会对性能产生一些影响。

关于c - 套接字保持在 CLOSE_WAIT 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25217277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com