根据文件:
注意,即使函数指示错误,也是底层的 描述符已关闭。
可能出现的错误是什么?
此外,如果socket.close()
发生错误,socket.is_open()
的结果是false
,socket.close()
的结果是{{1}}吗?
答案 0 :(得分:1)
通常,当Boost.Asio依赖于OS实现时,它既不会指定可能发生错误的条件,也不会指定可能返回的错误代码。
如果错误处理取决于确切的错误代码,则可以使用BSD API mapping documentation或consult the implementation来确定正在进行的OS调用。
如果是basic_socket::close()
,则实施将使用close()
或closesocket()
。可以使用适当的操作系统文档来确定错误情况,以及与asio/error.hpp
中的Boost.Asio错误代码相关联的错误返回值。
如basic_socket::close()
文档中所述,无论错误如何,底层描述符都将被关闭。此外,SocketService类型要求要求close()
的后置条件是is_open()
返回false。
service.close(impl, ec);
→!service.is_open(impl)
此外,虽然Boost.Asio文档是查找指定行为的最合适位置,但基于Asio的日期(2007-03-11)Networking Library Proposal for TR2 (Revision 1)偶尔会包含一些有用的措辞来理解详细信息:< / p>
error_code close(implementation_type& impl, error_code& ec);
...通过POSIX
建立后置条件close()
答案 1 :(得分:0)
我还没有检查过文档,但是如果套接字有明确关闭通信的协议(想想SSL),那就没有意义。
如果关闭序列无法完成(因为端点已关闭/无法访问?)那么这是一个错误,但套接字仍然关闭(因此该方面不会因资源泄漏而遭受资源泄漏无法控制的外部因素)
注意强>
说明
关于正常关闭连接套接字的可移植行为,请在关闭套接字之前调用
shutdown()
。