【发布时间】:2023-03-20 16:20:01
【问题描述】:
嗯..我使用一个典型的epoll+多线程模型来处理大量的套接字,即我有一个名为epollWorkThread的线程,它使用epoll_wait来处理i/o套接字。虽然有 EPOLLIN 事件,但 recv() 将完成工作,我确实使用 noblocking 模式来允许立即返回。并且 recv() 确实处于 while(true) 循环中。 在最初的时间内一切都很好(可能是几个小时或几分钟,或者如果我很幸运的话),我可以收到信息。但一段时间后,recv() 坚持返回 -1 且 errno = 107(ENOTCONN)。传输的另一个对等体是用 AS3 编写的,它确保套接字已连接。所以我对 recv() 行为感到困惑。提前感谢您,任何评论表示赞赏!
【问题讨论】:
-
没有答案,因为我不知道发生了什么,但尝试网络监视器以获取更多信息。我使用 tcpdump 或 wireshark,哪个更方便。不要忘记检查您的代码以查看是否有损坏导致此问题 (valgrind)。
-
感谢您提供的信息。我尝试了 tcpdump,但不知道如何捕获数据包。我试过“tcpdump -i eth0 'port myportnum'”,但它不会捕获任何东西......
-
你确定 eth0 吗?检查“ip 地址”。您是否以root身份尝试过?也许你没有正确的权限。参数没问题,虽然我还加了-s0和-wtrace.cap,所以可以用wireshark查看。
-
尝试一些更复杂的嗅探器,例如 Ethercap 或 Wireshark。 TCPDump 是一个非常有限的工具,没有经验很难正确使用。
-
好吧..使用tcpdum,我尝试了“tcpdump -s 0 -w file 'port myport'”以及“tcpdump -i eth0”和许多其他参数组合;使用wireshark我只能以root身份使用它,当它告诉我它很危险时。以普通用户的身份使用wireshark,结果发现无法调查任何界面。看来我必须了解更多……无论如何,谢谢大家。 (顺便说一句,我使用的是archlinux,而镜像中的Ethercap是不可用的)
标签: c++ network-programming posix