我开发了一个在Windows上使用套接字的应用程序。它运行良好,但一段时间后,互联网连接开始失败,最后我收到此错误 (10055(,这意味着我的应用程序缓冲区空间不足。
实际上,我认为我只使用我自己编写的代码的 2 个套接字,但确实我使用的是我不知道它是如何实现的 3rd 方库。
我读过有很多关于这个麻烦的文献,所以我不是唯一一个遭受它困扰的人,但我无法意识到如何解决它,或者至少绕过它,因为当它失败时,它会让我的电脑失去互联网连接。我已经通过捕获此错误来尝试它,当它发生时,做一个WSACleanup()
,WSAStartup()
即使这不是最佳实践......但是我的应用程序仍然在此错误中堆叠。
任何建议将不胜感激。
当您没有正确关闭套接字时,就会发生这种情况。当您要关闭套接字 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms741394(v=vs.85(.aspx(时,请确保您同时具有shutdown
和closesocket
从 MSDN - "Note To assure that all data is sent and received on a connection, an application should call shutdown before calling closesocket"
在bind
套接字之前,您可以使用SO_REUSEADDR
进行"Allows the socket to be bound to an address that is already in use"
setsocketopt
(http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476(v=vs.85(.aspx(
最后,看看这个博客 - http://blogs.technet.com/b/yongrhee/archive/2011/12/19/how-to-troubleshoot-a-handle-leak.aspx
应用程序中有一个或多个资源泄漏。
没有代码,我只能给出一般建议。
我建议您运行 Valgrind 或类似的工具来帮助您找到资源泄漏。
另一种方法是查看代码。如果泄漏是最近开始的,您可以通过查看最近的更改来找到它。
MSDN有一篇关于如何使用Visual Studio查找内存泄漏的文章。(请记住在链接页面上选择您的Visual Studio版本(。
Windows 中此错误的一个原因是临时 TCP 端口池耗尽。
重现此错误很容易:只需创建一个在绑定端口 0 中循环的程序。很快这个错误就会发生。
当我们将 0 传递给绑定套接字函数时,Windows 会选择一个要使用的临时端口。