什么原因导致 winsock 10055 错误?我应该如何排除故障?

什么原因导致 winsock 10055 错误?我应该如何排除故障?

我正在调查一系列自定义应用程序(其中一些我们控制,一些则不然)中 winsock 10055 错误的一些问题,希望获得一些关于解决问题的技术建议。

No buffer space available.
    An operation on a socket could not be performed because the system 
    lacked sufficient buffer space or because a queue was full.

根据研究,非分页池和端口似乎是唯一可能导致此错误的资源。 是否有其他资源可能会导致 10055 错误?

目前,我们在应用程序上设置了性能计数器,在大多数情况下,非分页池使用率看起来很低。打开的 TCP 连接看起来很低,我不知道还有其他方法可以监控端口。

由于这种情况只发生在生产中,我们无法使用更具侵入性的计数器。不过,听到其他解决方案仍然很有趣。我相信其他人可以使用这些信息。

您是否推荐其他工具或程序来诊断哪个应用程序导致了该问题?

更新:

该平台是带有 /3G 开关的 Windows Server 2003 x86。作为参考,x86 通常具有 256mb 的 NPP 存储,/3G 将其降低到 128mb。一般​​来说,您需要避免这种配置以避免 NPP 问题。(参考

我们有一个应用程序的源代码。我编写了非常复杂的测试工具,试图重现该行为,但无济于事。

如上所述,该问题仅发生在生产中。因此,避免了数据包监控。我们目前设置了性能计数器来监控 NPP、线程、网络流量等。由于 perfmon 的间隔为 1 秒,因此您可能会遇到在该窗口内来来去去的微突发。然而,有一些主观证据表明这不是问题。

基本情况是,连接的另一端表示由于错误代码为 10055 而关闭了连接。在断开连接之前,NPP(以及总体性能)看起来很稳定,这表明某些其他资源是导致连接断开的原因。

更新:

我还要重申,最初的问题与诊断有关,而不是解决方案。我仍然不清楚导致 10055 错误的原因。检查驱动程序和硬件并重新安装操作系统是很好的方法,但它回避了最初的问题。

答案1

根据 Google 搜索,内存不足也会导致这种情况,除此之外还有其他原因。我在 Google 上发现的一个错误情况是内存不足问题,即基本操作系统几乎无法访问内存。我猜想,在内存不足的虚拟环境中,很容易重现相同类型的问题。

一个更基本的故障排除问题很简单——您的生产环境有何不同?

您是否在 Windows 2003 x64 或 Windows 2008 中测试过该应用程序?

关于你问题的第二部分...

以下工具可用于排除故障和修复 Winsock 错误。

嗅探器:

http://www.wireshark.org/

垫片:

http://www.sstinc.com/winsock.html
http://www.win-tech.com/html/socktspy.htm

用于跟踪系统状态和资源的通用工具

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
http://technet.microsoft.com/en-us/sysinternals/bb896645

检测 API 调用的工具

http://www.apimonitor.com/
http://www.nektra.com/products/spystudio-api-monitor/

调试器

http://www.ollydbg.de/
http://www.immunitysec.com/products-immdbg.shtml

逆向工具或反编译器

http://www.hex-rays.com/products/ida/index.shtml
http://www.hex-rays.com/products/decompiler/index.shtml

您的标准 IDE 和编译器

http://www.microsoft.com/visualstudio/en-us

以下是其他工具的列表:

http://www.sockets.com/devtools.htm

找到的其他参考资料:

https://stackoverflow.com/questions/8118870/howto-debug-winsock-api-calls

http://brandon.fuller.name/archives/2007/01/24/19.44.29/

http://tangentsoft.net/<---- 可能是最好的一个

答案2

重新安装 2008 R2 服务器,希望可以正常工作。它具有全新的驱动程序架构和更好的网络可扩展性。

答案3

我不知道这是否有用,但我遇到了一个每隔几秒发送 UDP 广播消息的应用程序的 10055 错误。当广播应用程序位于笔记本电脑上并进入睡眠状态并被唤醒时,就会发生这种情况。

忽略几次连续的 UDP 广播的错误解决了这个问题。

当应用程序在睡眠后重新启动广播时,WinSock 似乎尚未完全恢复。

相关内容