【问题标题】:Erratic timeout when using TCP sockets locally on macOS在 macOS 上本地使用 TCP 套接字时出现异常超时
【发布时间】:2021-02-26 02:57:28
【问题描述】:

连接到同一台机器 (127.0.0.1) 上的另一个程序时,我偶尔会遇到超时错误 (ETIMEDOUT)。相关代码如下:

   do
   {
          fl=connect(mysocket, addr, len);
          if (fl != 0)
            usleep(wait *= 2);
   }
   while (fl == -1 && (errno == ETIMEDOUT));

我主要在 Linux 上进行开发,以相同方式运行的相同代码永远不会产生此错误。我觉得这真的很令人困惑,因为我无法想象本地连接时会出现任何延迟,而且我的理解是,如果主机端口不可用,错误将是 ECONNREFUSED。

【问题讨论】:

  • 你不能这样做。任何连接失败都会使套接字无法使用:您必须关闭它并创建一个新的并连接它。

标签: macos sockets tcp bsd


【解决方案1】:

正如 user207421 所指出的,该标准规定套接字在连接尝试失败后处于未定义状态。 Linux 将允许继续,但 macOS 不允许,因此解决方案是关闭套接字并创建新的。

【讨论】:

  • 什么标准? Linux 真的是这样吗?证据?
  • 我可以确认 ECONNREFUSED 的 Linux 行为,因为这很容易测试。手册页还暗示了 Linux 的不同行为:“如果 connect() 失败,则认为套接字的状态未指定。便携式应用程序应关闭套接字并创建一个新的套接字以重新连接。”
猜你喜欢
  • 2011-01-30
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多