0

我在我的代码中遇到了一个错误,它在重叠的套接字上使用了 WSARecv 和 WSAGetOverlapped 结果。在重负载下,WSAGetOverlapped 返回 WSASYSCALLFAILURE('一个永远不会失败的系统调用失败'),然后我的 TCP 流不同步,导致我的程序的上层出现混乱。

到目前为止,我还无法将它隔离到一组给定的硬件或驱动程序中。是否有人也遇到了这个问题,并找到了解决方案或解决方法?

4

2 回答 2

1

多少个连接,多少个待处理的接收,多少个外发送?perfmon 或任务管理器对使用的非分页池的数量有何看法?盒子里有多少内存?如果您在 Vista 或更高版本上运行该程序,它会消失吗?你有安装任何 LSP 吗?

您可能会耗尽非分页池,并导致写入错误的驱动程序在无法分配内存时行为不端。这个问题不太可能在 Vista 或更高版本上出现,因为可用的非分页池数量急剧增加(请参阅 http://www.lenholgate.com/blog/2009/03/excellent-article-on-non-paged -pool.html了解详情)。或者,您可能会达到“锁定页面”限制(您只能在操作系统的内存中锁定固定数量的页面,并且每个挂起的 I/O 操作会根据缓冲区大小和分配对齐方式锁定一个或多个页面)。

于 2010-07-16T11:18:33.173 回答
0

看来我已经通过休眠 1ms 并在报告 WSASYSCALLFAILURE 时重试 WSAGetOverlapped 结果解决了这个问题。

我遇到了另一个与触发重叠事件有关的问题,即使没有数据,我也必须先解决这个问题。测试现在运行了一个多小时,正确处理了一些 WSASYSCALLFAILURE。希望通宵测试也能成功。

@Len:再次感谢您的帮助。

编辑:通宵测试成功。我的错误是由两个相互依赖的问题引起的:

问题 1:ConnectionSet::select 中的 WaitForMultipleObjects 偶尔会在空套接字上发出数据信号,导致 SocketConnection::readSync 死锁。修复:对每个数据包的第一个字节进行非阻塞读取。如果套接字为空,则重置 ConnectionSet

问题 2:WSAGetOverlappedResult 偶尔返回 WSASYSCALLFAILURE,导致 TCP 流不同步。修复:在一小段睡眠期重试 WSAGetOverlappedResult 。

http://equalizer.svn.sourceforge.net/viewvc/equalizer?view=revision&revision=4649

于 2010-07-22T12:29:08.473 回答