Joh*_*ane 5 boost asynchronous tcp shutdown boost-asio
boost::asio TCP 套接字接受/读/写都提供异步版本,但不关闭。
在我的代码中,我只是调用了 socket.close(),并且大部分时间它都可以正常工作。它触发了正常的 TCP 关闭。
但有时,close() 只是在没有关闭 TCP 的情况下关闭套接字。因此,我必须改为调用 shutdown()。但我不想阻止我的代码。在 boost:asio 中,shutdown() 是否阻塞?关闭()怎么样?close() 是否阻塞?
首先,Boost.Asio 中的shutdown()
和close()
调用调用了底层的 BSD 套接字实现。所以 Asio 的 shutdown() 或 close() 调用没有什么“特别的”。
shutdown()
不阻塞。它通常用于禁用发送/接收或两者(即,向另一端发送 EOF)。它不会破坏套接字(即不释放套接字资源)
close()
将释放套接字资源。根据SO_LINGER
选项,它也可能会阻塞。但这SO_LINGER
是一个棘手的野兽,说服你:http :
//lists.freebsd.org/pipermail/freebsd-questions/2004-June/049093.html和http://developerweb.net/viewtopic.php?id=2982。但是,如果您使用的是非阻塞套接字(即 O_NONBLOCK,这是 Boost.Asio 真正包含的内容),则 close() 不会阻塞。
进一步阅读:
http://linux.die.net/man/3/shutdown http://linux.die.net/man/3/close
如果你是 Windows:http : //msdn.microsoft.com/en-us/library/windows/desktop/ms738547%28v=vs.85%29.aspx (阅读评论,显然记录在案的优雅关机技术不一直都在工作..)