微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用boost :: asio :: ip :: tcp :: socket :: cancel和socket :: close

如何解决使用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 举报,一经查实,本站将立刻删除。