在linux中调用socket.close之后,socket.read_some需要相当长的时间才能返回

It takes quite a moment for socket.read_some to return after socket.close has been called, in linux

本文关键字:socket 时间 返回 some 调用 linux close 之后 read      更新时间:2023-10-16

我正在使用Boost.Asio作为一个简单的套接字库。

当我打开一个套接字时,我创建一个线程,该线程在该套接字

上不断读取,并在套接字关闭或发生其他错误时返回。

while((read = socket->read_some(buf, ec)) != 0) {
    // deal with bytes read
}

此代码在 Windows 和 Mac 上运行良好。但是对于 linux,当套接字从主线程关闭时,socket::read_some需要很长时间才能返回 - 我发现它超过 2 分钟。

我能做些什么来改善这一点吗?

如果需要取消功能,请使用异步套接字。不要使用同步方法,例如 read_some 。这已经在asio-users邮件列表中进行了无限的讨论。在提升错误跟踪器上也有一张票讨论它。

另请参阅我对类似问题的回答。

最后我找到了原因:在 Linux 中,如果你用 socket::close 关闭一个套接字,那么这个套接字就不会关闭。您必须正常关闭套接字才能成功关闭它。

socket->shutdown(shutdown_both); // add this
socket->close();