C++ errno=107的recv()(已连接传输端点)

C++ errno=107的recv()(已连接传输端点),c++,network-programming,posix,C++,Network Programming,Posix,嗯..我使用一个典型的epoll+多线程模型来处理大量套接字,也就是说,我有一个名为epollWorkThread的线程,它使用epoll_wait来处理I/o套接字。当有一个EPOLLIN事件时,recv()将完成这项工作,我使用noblocking模式允许立即返回。recv()确实处于while(true)循环中。 在开始的时候一切都很好(也许几个小时,也许几分钟,或者如果我运气好的话),我可以收到信息。但过了一段时间,recv()坚持返回-1,errno=107(ENOTCONN)。传输的

嗯..我使用一个典型的epoll+多线程模型来处理大量套接字,也就是说,我有一个名为epollWorkThread的线程,它使用epoll_wait来处理I/o套接字。当有一个EPOLLIN事件时,recv()将完成这项工作,我使用noblocking模式允许立即返回。recv()确实处于while(true)循环中。
在开始的时候一切都很好(也许几个小时,也许几分钟,或者如果我运气好的话),我可以收到信息。但过了一段时间,recv()坚持返回-1,errno=107(ENOTCONN)。传输的另一个对等端写在AS3中,以确保套接字已连接。所以我对recv()的行为感到困惑。提前感谢您,如有任何意见,我们将不胜感激

Errno 107表示插座未连接(不再连接)。
有几个原因可以解释为什么会发生这种情况。假设您是对的,并且连接双方都声称套接字仍然打开,则中间路由器/交换机可能由于超时而断开了连接。避免此类事件发生的最安全方法是定期发送“健康”或“保持活力”信息。(因此,中间路由器/交换机将连接视为活动连接…=

无应答,因为我不知道发生了什么,但请尝试网络监视器以获取更多信息。我使用tcpdump或wireshark,任何更方便的。别忘了检查你的代码,看看是否是腐败导致了这个问题(valgrind)。谢谢你提供的信息。我尝试了tcpdump,但不知道如何捕获数据包。我尝试了“tcpdump-I eth0'port myportnum'”,但它无法捕获任何内容…您确定eth0吗?检查“ip地址”。你试过根吗?也许你没有得到正确的许可。虽然我还添加了-s0和-wtrace.cap,所以我可以用wireshark查看它,但参数还可以。尝试一些更复杂的嗅探器,如Ethercap或wireshark。TCPDump是一个非常有限的工具,没有经验很难正确使用;使用wireshark,当它告诉我它很危险时,我只能将它用作根。以普通用户的身份使用wireshark,结果证明没有界面可以被调查。看来我必须了解更多…无论如何,谢谢大家。(顺便说一句,我使用archlinux,而Ethercap在镜像中不可用)