【问题标题】:Non blocking socket connect() get errno ETIMEDOUT-Connection timed out非阻塞套接字 connect() 得到 errno ETIMEDOUT-Connection timed out
【发布时间】:2020-04-04 11:39:37
【问题描述】:

我有一个非阻塞 IPv4 TCP 套接字,当我尝试 connect() 时,我得到 errno ETIMEDOUT。这让我很困惑,因为我没有在套接字上设置超时。这个案子有哪些可能的原因?

【问题讨论】:

  • 你确定套接字是非阻塞的吗?在非阻塞套接字上执行 connect 时,我不会想到此错误,而是 EINPROGRESS
  • @SteffenUllrich 可能会失败 fnctl() 因为我没有对 fnctl() 返回值进行错误检查,但是,如果失败了,那么它应该永远阻塞,因为我有没有设置超时值。
  • @SteffenUllrich 另外,假设 fnctl() 失败,它总是失败。由于我的系统有重试机制。如果失败,套接字将被关闭,然后创建一个新的,再次设置非阻塞。除了 fnctl() 之外,其他选项如何正确设置。在我看来,fnctl() 失败的情况很少见。
  • 根据您编写的内容,您的代码似乎缺少错误检查,您并不确切知道这个问题来自哪里。我认为您需要提供Minimal, Reproducible Example,以便人们可以查看真正导致问题的原因,而不仅仅是做出(可能没有根据的)假设。
  • @SteffenUllrich 从逻辑推理来看,我确信它是非阻塞的。我将检查 Linux 内核。我的内核不是标准的 Linux 内核,可能它有一些奇怪的东西。所以还是谢谢你的帮助。

标签: c sockets connection-timeout errno


【解决方案1】:

来自man页面:

ETIMEDOUT:

尝试连接时超时。服务器可能太忙了 接受新的连接。请注意,对于 IP 套接字,超时可能是 在服务器上启用 syncookies 时会很长。

您还可以在此问题中看到 ETIMEDOUT How to handle ETIMEDOUT error

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 2010-11-15
    相关资源
    最近更新 更多