C++ 在linux中,调用socket.close后,socket.read_some需要很长时间才能返回

C++ 在linux中,调用socket.close后,socket.read_some需要很长时间才能返回,c++,linux,sockets,tcp,boost-asio,C++,Linux,Sockets,Tcp,Boost Asio,我使用Boost.Asio作为一个简单的套接字库 当我打开一个套接字时,我会创建一个线程,该线程会一直读取该套接字,并在套接字关闭或发生其他错误时返回 while((read = socket->read_some(buf, ec)) != 0) { // deal with bytes read } 此代码在Windows和Mac上运行良好。然而,在linux中,当套接字从主线程关闭时,socket::read_some需要相当长的时间才能返回-我发现这需要2分钟多的时间 有什

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

当我打开一个套接字时,我会创建一个线程,该线程会一直读取该套接字,并在套接字关闭或发生其他错误时返回

while((read = socket->read_some(buf, ec)) != 0) {
    // deal with bytes read
}
此代码在Windows和Mac上运行良好。然而,在linux中,当套接字从主线程关闭时,
socket::read_some
需要相当长的时间才能返回-我发现这需要2分钟多的时间

有什么可以改进的吗?

如果您愿意,可以使用异步套接字。不要使用同步方法,例如
read\u some
。这在asio用户邮件列表中已被无限讨论。boost bug追踪器上也有一个讨论它的帖子


还有一个类似的问题。

最后我找到了原因:在Linux中,如果使用socket::close关闭套接字,那么套接字是未关闭的。您必须优雅地关闭插座,才能成功地关闭它

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

感谢您的回答,根据我的经验,使用同步套接字仍然可以具有取消功能。因为当套接字发生错误时,read_some应该返回。我已经找到了这个问题的解决方案,请参见下面的答案。Windows/Mac上不存在这样的问题。