Windows 2003服务器套接字错误10055

时间:2011-06-16 06:21:19

标签: winapi winsock

我在Windows 2003服务器上运行了一个非常大的应用程序。它创建了近900个线程和一个在套接字上运行的线程。这是我用Visual Studio环境编译的C ++应用程序。

经过近17-20小时的测试,发送数据时出现10055套接字错误。 除了这个错误,我的应用程序运行良好,没有任何错误或问题。它是一个具有4 GiB RAM的四核系统,该应用程序在所有运行中占用大约30-40%的CPU(在所有4个CPU上)。

这里的任何人都可以帮我解决这个问题。我几乎搜索了谷歌关于这个错误的所有内容,但无法得到与我的案例相关的任何内容。

3 个答案:

答案 0 :(得分:1)

我认为,不可能说莫:

  

错误10055表示Windows已运行   超出TCP / IP套接字缓冲区因为   一次打开太多连接。

http://kbase.pscs.co.uk/index.php?article=93

https://wiki.pscs.co.uk/how_to:10055

答案 1 :(得分:0)

我之前在IOCP套接字系统中看到过这种症状。我不得不限制传出的异步套接字发送,这样就不会有太多数据在内核中排队等待在套接字上发送。

虽然错误文本说这是由于连接数量而发生的,但这不是我的经验。如果你编写一个紧凑的循环在单个套接字上执行异步发送,没有限制,你可以很快地点击它。

@Len Holgate可能会在这里添加一些东西,他是我对Windows套接字问题的“goto guy”。

答案 2 :(得分:0)

 It creates almost 900 threads

那是部分你的问题。每个线程可能使用默认的1MB堆栈。您开始接近GB的线程开销。内存耗尽的可能性很高。使用IOCP的全部意义在于您不必创建“每个连接的线程”。您可以创建几个线程(从1x到4x的CPU数量)来监听完成端口处理程序,并让每个线程服务一个不同的请求以最大化可伸缩性。

我记得读过一篇链接Stack Overflow的文章,缓冲你发布的挂起IOCP操作,这样操作系统就不会让内存从物理内存换到磁盘。然后,当连接数量很高时,您可能会耗尽系统资源。

如果我没记错的话,解决方法是为每个套接字连接发布一个0字节缓冲区(或者它是1字节缓冲区)。当数据到达时,您的完成端口处理程序将返回,这是您的代码提示发布更大的缓冲区。如果我能找到链接,我会分享。