问题描述
在连接到同一台机器 (127.0.0.1) 上的另一个程序时,我偶尔会遇到超时错误 (ETIMEDOUT)。相关代码如下:
do
{
fl=connect(mysocket,addr,len);
if (fl != 0)
usleep(wait *= 2);
}
while (fl == -1 && (errno == ETIMEDOUT));
我主要在 Linux 上进行开发,以相同方式运行的相同代码永远不会产生此错误。我觉得这真的很令人困惑,因为我无法想象本地连接时会有任何延迟,我的理解是,如果主机端口不可用,则错误将是 ECONNREFUSED。
解决方法
正如 user207421 所指出的那样,标准说在连接尝试失败后,套接字处于未定义状态。 Linux 允许继续,但 macOS 不允许,因此解决方案是关闭套接字并创建新套接字。