使用挂起连接关闭boost :: asio :: ip :: tcp :: socket

时间:2013-05-23 13:40:20

标签: boost boost-asio

根据boost asio文档,如果我在一个挂起异步连接操作的套接字上调用close,则会立即使用错误代码“立即”调用该处理程序。来自文档:

  

此功能用于关闭套接字。任何异步发送,接收或连接操作都将立即取消,并将以boost :: asio :: error :: operation_aborted错误完成。

但是处理程序实际上并不是立即/同步调用的,当控制返回到io_service时会异步调用它。在我调用close之后,如果连接实际成功且我的处理程序回调已经发布到io_service,我的连接处理程序是否仍然可以被调用而没有错误代码

2 个答案:

答案 0 :(得分:2)

文档说明未完成的操作将立即取消,而不是立即调用

连接操作可能已经完成,并且处理程序在io_service中排队等待延迟调用,其error_codeboost::system::errc::success。可能值得考虑检查完成处理程序中的套接字is_open(),如this中所做的那样。有关此行为的详细信息,请参阅this answer。

答案 1 :(得分:1)

操作将立即取消,但不会同步调用处理程序。如果在调用close()时队列中已经存在“正常”完成处理程序,则肯定会调用它,并且您将不会获得“operation_aborted”。