【发布时间】: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