【问题标题】:recv() with errno=107:(transport endpoint connected)recv() with errno=107:(传输端点已连接)
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 2011-10-31
    • 2016-01-13
    • 2018-11-06
    相关资源
    最近更新 更多