boost :: asio TCP套接字接受/读/写都提供异步版本,但不是关闭。
在我的代码中,我只是调用socket.close(),并且大多数时候它工作正常。它触发了一个优雅的TCP关闭。
但有时候,close()只是在没有TCP关闭的情况下关闭套接字。因此,我必须调用shutdown()。但我不想阻止我的代码。 在boost:asio中是shutdown()阻塞吗? close()怎么样?是close()阻塞吗?
答案 0 :(得分:3)
首先,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 (阅读评论,显然记录的优雅关闭技术不能一直工作..)