gpt4 book ai didi

c++ - 使用 Boost.Asio 强制异步套接字读取提前完成

转载 作者:行者123 更新时间:2023-11-28 06:04:02 27 4
gpt4 key购买 nike

我有一个 tcp::socket用于读取和写入数据。有一个由链接 async_read_some() 组成的读取循环和处理程序 on_data_read()那叫async_read_some()处理读取的数据后再次。一个相关shared_ptr<tcp::socket>沿着循环传递。 on_data_read() 时循环结束调用失败 error_code例如 asio::error::eof , 在这种情况下 async_read_some()不被调用。

套接字上也可能存在异步写入,这是通过重复调用async_write_some()来完成的。直到所有数据写入。即处理程序 on_data_written()对于 async_write_some()电话 async_write_some()如果数据仅部分写入,则再次。相关shared_ptr<tcp::socket>也沿着调用链传递。

现在,我想以安全的方式关闭套接字。具体来说,我想强制异步读取以非成功错误代码提前完成以结束读取循环。如果没有挂起的写调用链,唯一的shared_ptr<tcp::socket> (沿着读取循环传递的那个)被其管理的 tcp::socket 销毁关闭并销毁。如果有一个挂起的写调用链,它会继续,直到所有数据都被写入。在写入调用链结束时,最后一个 shared_ptr<tcp::socket> (沿着写入调用链传递的那个)被销毁。从套接字在挂起的写入(如果有)之后关闭的意义上讲,此过程是安全的。

问题是

  • 如何强制异步套接字读取以非成功错误代码完成?

我检查了 linger选项。但它不会工作,因为我正在使用链接 async_write_some()而不是单个 async_write() .因此,套接字可能会在 on_data_written() 时关闭。正在被调用。 cancel()close()也不会工作,因为它们不仅会中断读取循环,还会中断写入调用链。虽然 shutdown()只能应用于读取循环,它可以防止将来 async_read_some()仅调用,对已经完成的操作没有影响。我已经制定了一个解决方法。即调用cancel() , 但有 on_data_written()忽略由 cancel() 引起的错误代码并继续写入调用链。我对这个解决方案不满意(请参阅备注部分 here )。我想知道是否有更直接和优雅的方式来实现我想要的,或者整个设计只是有缺陷?

最佳答案

在我看来,您总结得非常好。

你真的没有比全面取消更好的了。实际上,您可以恢复任何已取消的写入。

我认为没有比这更优雅的了。我不会说设计有缺陷,但您可能想要考虑不实际取消挂起的操作,而只是保留一个标志以指示“逻辑读取取消”是否挂起并防止在这种情况下链接更多读取

关于c++ - 使用 Boost.Asio 强制异步套接字读取提前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32744557/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com