用挂起的连接关闭boost :: asio :: ip :: tcp :: socket
根据boost asio文档,如果我在具有未决异步连接操作的套接字上调用close,则该处理程序将被错误代码“立即”调用。 从文档:
该功能用于关闭套接字。 任何异步的发送,接收或连接操作都会立即被取消,并且会以boost :: asio :: error :: operation_aborted错误结束。
但是处理程序实际上不是立即/同步调用的,当控制权返回到io_service时,它将被异步调用。 如果连接实际上成功了,并且我的处理程序回调已经发布到io_service,那么在我调用close之后,是否有可能我的连接处理程序仍然被调用而没有错误代码?
该文件指出,未完成的操作将立即取消,而不是立即被调用。
连接操作可能已经完成,并且处理程序在io_service
进行排队以获得延迟调用,其error_code
作为boost::system::errc::success
。 在完成处理程序中,可能需要考虑检查套接字is_open()
,就像在这个答案中所做的那样。 有关此行为的更多详细信息,请参阅此答案。
操作将立即取消,但处理程序不会同步调用。 如果调用close()
时“正常”完成处理程序已经在队列中,它肯定会被调用,并且不会得到“operation_aborted”。
上一篇: closing a boost::asio::ip::tcp::socket with pending connect