【问题标题】:closing a boost::asio::ip::tcp::socket with pending connect使用挂起的连接关闭 boost::asio::ip::tcp::socket
【发布时间】:2013-05-23 13:40:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: boost boost-asio


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。那么您是否同意该文档在这方面并不完全正确?声称“任何异步发送、接收或连接操作将立即取消,并将完成 boost::asio::error::operation_aborted 错误。”,不一定是真的。
    • 文档完全正确。异步操作的生命周期在完成时结束;它不是由完成处理程序的发布或调用决定的。当cancel() 被调用时,所有异步操作都将被取消,它们的处理程序将被设置为延迟调用,error 设置为boost::asio::error::operation_aborted error
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答;我同意,仔细阅读后,措辞并不清楚。
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2012-05-25
    • 2017-04-27
    • 2012-11-09
    相关资源
    最近更新 更多