4

根据 boost asio 文档,如果我在一个有异步连接操作挂起的套接字上调用 close,则处理程序将被“立即”调用并带有错误代码。从文档中:

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

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

4

2 回答 2

2

该文档指出未完成的操作将立即取消,而不是立即调用它们。

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

于 2013-05-23T13:57:40.010 回答
1

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

于 2013-05-23T13:56:23.347 回答