ip :: tcp :: socket.close()有哪些可能的错误?

时间:2014-05-26 05:58:49

标签: boost boost-asio

根据文件:

  

注意,即使函数指示错误,也是底层的   描述符已关闭。

可能出现的错误是什么?

此外,如果socket.close()发生错误,socket.is_open()的结果是falsesocket.close()的结果是{{1}}吗?

2 个答案:

答案 0 :(得分:1)

通常,当Boost.Asio依赖于OS实现时,它既不会指定可能发生错误的条件,也不会指定可能返回的错误代码。

如果错误处理取决于确切的错误代码,则可以使用BSD API mapping documentationconsult 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()

from the docs