gpt4 book ai didi

c++ - 当 asyn_read 可能在 boost.ASIO 中进行时销毁套接字对象是否安全?

转载 作者:太空狗 更新时间:2023-10-29 20:48:53 25 4
gpt4 key购买 nike

在下面的代码中:

tcp::socket socket(io_service);
tcp::endpoint ep(boost::asio::ip::address::from_string(addr), i);


socket.async_connect(ep, &connect_handler);

socket.close();

关闭套接字对象是否正确,还是应该只在 connect_handler() 中关闭它,求助于 shared_ptr 来延长套接字对象的生命周期?谢谢。

最佳答案

关闭套接字不是什么大问题,但要销毁和释放套接字才是大问题。处理它的一种方法是确保套接字比正在完成工作的 io_service 更长寿。换句话说,您只需确保在 io_service 退出之前不要删除它。显然,这并非在所有情况下都有效。

在各种情况下,当套接字在 io_service 中处于事件状态时,很难甚至不可能判断套接字何时真正完成所有工作,并且 ASIO 不提供任何机制来显式删除或断开对象的回调,因此它们不要被叫到。因此,您应该考虑将连接保存在 shared_ptr 中,这将保留连接对象,直到 io_service 中的最后一个引用被释放。

与此同时,您的处理程序仿函数应该处理所有可能传入的错误,包括被破坏的连接。

关于c++ - 当 asyn_read 可能在 boost.ASIO 中进行时销毁套接字对象是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2369976/

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