2011-06-16 34 views
1

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

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

任何人都可以帮助我通过这个。我在谷歌搜索了几乎所有关于这个错误的东西,但是没有得到任何与我的案例相关的东西。

回答

0

我已经在IOCP插座系统前看到此症状。我必须限制传出的异步套接字发送,以便不会有太多数据在内核中排队等待在套接字上发送。

虽然错误文字说这是由于连接数量而发生的,但这不是我的经验。如果您编写一个紧密循环,在单个套接字上执行异步发送,而不进行任何限制,则可以非常快速地实现这一点。

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

+0

嗨@Steve Townsend,我无法正确解释您的解决方案。即使我知道我的问题是因为没有。的连接(因为我在应用程序的整个生命周期中只使用连接),尽管我创建了许多不。的线程,这是为了一些其他的考虑。所以它肯定肯定是一些问题,你正在怀疑内存缓冲区被填满了。你可以给我更多的指针,我可以开始寻找这个。 – pjain 2011-08-30 08:03:38

+0

@伦霍尔盖特你能帮我解决吗?我仍然无法解决这个问题。我也尝试过使用TCP_NO_DELAY来使它尽快发送数据,但仍然存在这个问题。 – pjain 2011-11-02 12:59:51

0
It creates almost 900 threads 

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

我记得读过一篇关于Stack Overflow的文章,该文章将缓冲您发布的挂起IOCP操作的设置,使得操作系统不会让内存从物理内存换出到磁盘。然后,当连接数量变高时,您可能会耗尽系统资源。

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

相关问题