如何解决使用boost :: asio :: ip :: tcp :: socket :: cancel和socket :: close
| 如果我使用关闭而不是取消,则存在一些问题。 “ 0”函数可以关闭套接字,并且通过返回“ 1”错误来停止任何未完成的异步操作。 为什么我应该使用cancel
而不是close
?
我担心如果正在执行一些异步操作,则cancel
无法取消它,是吗?
像asio::ip::tcp::resolve::cancel
一样,我在调用async_resolve
之后尝试多次取消resolve_handler
,但是resolve_handler
总是返回而没有with1ѭ错误。
我认为正在执行resolve_handler
?
是?
解决方法
如果要在不关闭套接字的情况下停止挂起的操作,则“取消”很有用。
请注意,Boost文档建议使用close以获得更大的可移植性(来自doc页面):
...
对于便携式取消,请考虑
使用以下之一
备择方案:
禁用asio的I / O完成端口
通过定义后端
BOOST_ASIO_DISABLE_IOCP。
使用
close()函数可以同时
取消未完成的操作并
关闭插座。
,
cancel
不会关闭套接字,因此如果要继续使用套接字对象,请使用cancel
。尤其是,如果异步处理程序方法中的代码引用了套接字的成员函数,则在确保当前执行的异步处理程序完成之前,您可能不想关闭套接字。
cancel
不能保证当前正在执行的异步处理程序,它只能保证(根据boost文档)\“14ѭ调用的情况下,“此函数使所有未完成的异步连接,发送和接收操作立即完成”,或\“此函数强制在主机解析器上完成所有待处理的异步操作\”(在调用“ 15”的情况下)。这个“完成”意味着boost将调用您的异步处理程序方法,它没有权限将任何取消逻辑注入到您的异步处理程序中(更不用说它不知道该处理程序的实现是如何开始的) 。
我建议将自己的逻辑添加到异步处理程序方法中,以处理socket / resolver / etc的情况。被取消。如果您正在调用cancel方法,则可能可以将此取消通知异步处理程序方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。