我的代码在单个线程中使用boost :: asio和io_service来执行各种套接字操作。所有操作都是异步的,每个处理程序都依赖于boost::system::error_code
(特别是boost::asio::error::operation_aborted
)来确定操作的结果。boost :: asio异步处理程序在取消后调用时没有错误
它一直工作得很好,直到我改变逻辑,使几个并发连接,并选择最快的一个。也就是说,当第一个async_read_some
处理程序触发时,我取消其他套接字(关闭,关闭 - 所有内容),并继续使用当前的套接字。在95%的情况下,其他套接字的读处理程序会被调用operation_aborted错误。然而有时候,这些读处理程序被调用时没有错误,告诉我他们已经成功接收了N个字节。
但对于插座的文档::取消()states:
此功能使所有未完成的异步连接,发送和接收 操作立即完成,并 业务取消的处理程序会通过
boost::asio::error::operation_aborted
错误。
所以,问题:我真的可以依靠生产代码中的operation_aborted
错误吗?如果可以的话,这是Asio从boost 1.46.1中的一个错误吗?如果我不能,有没有关于这方面的官方文件?
看起来你的情况是多个处理程序在调用cancel之前已经“成功”了。你可以依靠'operation_aborted'传递给尚未执行的任何处理程序(并且正在等待被调用)。 – Chad