2010-01-25 38 views
4

好吧..我使用epoll + multithread的典型模型来处理大量的套接字,也就是说,我有一个线程叫做epollWorkThread,它使用epoll_wait来处理I/O插座。虽然有EPOLLIN事件,recv()将完成这项工作,并且我使用非锁定模式来允许立即返回。而recv()确实是在一段时间(true)循环中。 在初始时间(可能是几个小时或者几分钟,或者如果我很幸运的话),一切都很好,我可以收到信息。但过了一段时间,recv()坚持返回-1,errno = 107(ENOTCONN)。传输的另一端用AS3编写,确保插座已连接。所以我对recv()的行为感到困惑。预先感谢您的意见,并表示感谢!recv()与errno = 107 :(运输端点连接)

+0

没有答案,因为我不知道发生了什么,但尝试使用网络监视器来获取更多信息。我使用tcpdump或wireshark,任何更方便。不要忘记检查你的代码,看看腐败是否可能导致这个问题(valgrind)。 – stefaanv 2010-01-25 11:59:57

+0

感谢您的信息。我尝试了tcpdump,但未能知道如何捕获数据包。我试过“tcpdump -i eth0'port myportnum'”但它不会捕获任何东西... – iBacchus 2010-01-26 07:12:08

+0

你确定关于eth0吗?检查“ip地址”。你有没有尝试过它作为根?也许你没有正确的许可。 参数没问题,虽然我也加了-s0和-wtrace.cap,所以我可以用wireshark查看它。 – stefaanv 2010-01-26 12:14:42

回答

3

errno 107意味着插座是不是连接(任何更多)。 这可能发生的原因有几个。假设你是对的,并且连接的两端都声称套接字仍处于打开状态,则中间路由器/交换机可能由于超时而断开连接。避免发生这种事情的最安全的方法是定期发送“健康”或“保持活跃”的信息。 (因此,中间路由器/交换机接受连接作为生活...)=

相关问题