关闭具有挂起连接的boost::asio::ip::tcp::socket

4
根据boost asio文档,如果我对一个正在进行异步连接操作的套接字调用close,则处理程序将“立即”使用错误代码被调用。从文档中可以看到:
这个函数用于关闭套接字。任何异步发送、接收或连接操作都将立即取消,并且将使用boost::asio::error::operation_aborted错误完成。
但实际上,处理程序并不是立即/同步地被调用的,而是在控制返回到io_service时异步地被调用。如果连接已经成功并且我的处理程序回调已经被发布到io_service中,那么在我调用close后,我的连接处理程序仍然可能会被调用没有错误代码吗?
2个回答

2
文件说明指出未完成的操作将被立即“取消”,而不是立即“调用”。
连接操作可能已经完成,并且处理程序已排队在`io_service`中以延迟调用,其`error_code`为`boost::system::errc::success`。 值得考虑在完成处理程序中检查套接字是否is_open(),就像这个答案中所做的那样。 有关此行为的更多详细信息,请参见这个答案。

谢谢你的回答。那么你是否同意文档在这方面并不严格正确?声称“任何异步发送、接收或连接操作都将立即被取消,并将以boost::asio::error::operation_aborted错误完成。”,这并不一定是真实情况。 - jbox
文档说明严格正确。异步操作的生命周期在其完成时结束;它不受完成处理程序的发布或调用的控制。当调用 cancel() 时,所有异步操作都将被取消,并将设置其处理程序以延迟调用,其中 error 设置为 boost::asio::error::operation_aborted error - Tanner Sansbury

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

谢谢你的回答;我同意,仔细阅读后措辞并不含糊。 - jbox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接