我开发了一个在Windows上使用套接字的应用。它工作得很好,但一段时间后,互联网连接开始失败,最后我收到此错误(10055),这意味着我的应用程序用完了缓冲区空间。
实际上我认为我只使用2个插槽和我自己做的代码,但我确实使用的是第三方库,我不知道它是如何实现的。
我读过有很多关于这个问题的文献,所以我不是唯一受此困扰的文学,但我不知道如何解决它,或者至少绕过它,因为当它失败时,它使我的电脑失去了互联网连接。我已经尝试过捕获此错误并在发生错误时执行WSACleanup()
,WSAStartup()
,即使这不是最佳做法...但我的应用仍会堆积在此错误中。
任何建议都会非常感激。
答案 0 :(得分:2)
通常,当您正确关闭套接字时会发生这种情况。如果要关闭套接字(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
setsocketopt
"Allows the socket to be bound to an address that is already in use"
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
答案 1 :(得分:0)
您的应用程序中有一个或多个资源泄漏。
没有代码,我只能提供一般性建议。
我建议您运行Valgrind或类似的工具来帮助您找到资源泄漏。
另一种方法是查看代码。 如果泄漏最近开始,您可以通过查看最近的更改来找到它。
MSDN有一个article on how to locate memory leaks using Visual Studio。 (请记住在链接页面上选择您的Visual Studio版本。)
答案 2 :(得分:0)
Windows中此错误的一个原因是临时TCP端口池的耗尽。
重现此错误很容易:只需创建一个在绑定端口0中循环的程序。 很快就会发生此错误。
当我们将0传递给绑定套接字函数时,Windows将选择一个临时端口使用。