我在我的代码中遇到了一个错误,该错误在重叠的套接字上使用WSARecv和WSAGetOverlapped结果。在负载很重的情况下,WSAGetOverlapped返回WSASYSCALLFAILURE('一个永远不会失败的系统调用失败'),之后我的TCP流不同步,导致程序上层出现混乱。
到目前为止,我还未能将它与一组给定的硬件或驱动程序隔离开来。有人也遇到过这个问题,并找到了解决方案或解决方法吗?
答案 0 :(得分:1)
有多少个连接,有多少挂起的recv,多少外包发送? perfmon或任务管理员对所使用的非分页池的数量有何看法?盒子里有多少内存?如果你在Vista或更高版本上运行该程序,它会消失吗?你有没有安装LSP?
如果无法分配内存,您可能会耗尽非分页池并导致编写错误的驱动程序出错。此问题不太可能在Vista或更高版本上受到影响,因为非页面缓冲池的数量已大幅增加(有关详细信息,请参阅http://www.lenholgate.com/blog/2009/03/excellent-article-on-non-paged-pool.html)。或者,您可能会遇到“锁定页面”限制(您只能在OS上的内存中锁定固定数量的页面,并且每个挂起的I / O操作会根据缓冲区大小和分配对齐锁定一个或多个页面。)
答案 1 :(得分:0)
我似乎已经通过休眠1ms并在报告WSASYSCALLFAILURE时重试WSAGetOverlapped结果来解决了这个问题。
我有另一个与重叠事件触发相关的问题,即使没有数据,我也必须首先解决。测试现在运行了一个多小时,正确处理了一些WSASYSCALLFAILURE。希望隔夜测试也能成功。
@Len:再次感谢您的帮助。
编辑:隔夜测试成功。我的错误是由两个相互依赖的问题引起的:
问题1:ConnectionSet中的WaitForMultipleObjects ::偶尔选择 在空套接字上发出信号,导致SocketConnection :: readSync 僵局。 修复:对每个数据包的第一个字节执行非阻塞读取。重启 如果套接字为空,则为ConnectionSet
问题2:WSAGetOverlappedResult偶尔会返回WSASYSCALLFAILURE, 导致TCP流不同步。 修复:在一个小睡眠期后重试WSAGetOverlappedResult 。
http://equalizer.svn.sourceforge.net/viewvc/equalizer?view=revision&revision=4649