代码之家  ›  专栏  ›  技术社区  ›  t.g.

在boost.ASIO中进行异步读取时销毁套接字对象安全吗?

  •  3
  • t.g.  · 技术社区  · 14 年前

    在以下代码中:

    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() ,是否使用共享\u ptr来延长套接字对象的寿命? 谢谢。

    3 回复  |  直到 11 年前
        1
  •  3
  •   karunski    14 年前

    关闭套接字并不是什么大问题,但是正在被破坏和释放的套接字却不是问题。解决这个问题的一种方法是确保套接字比正在进行工作的io\u服务更有效。换句话说,您只需确保在io\ U服务退出之前不要删除它。显然,这并不是在所有情况下都有效。

    在各种情况下,很难判断套接字在iou服务中处于活动状态时,所有工作何时真正完成,ASIO也不提供任何机制来显式删除或断开对象的回调,这样它们就不会被调用。因此,您应该考虑在SydDypTR中保持连接,这将保持连接对象直到IOIOService内部的最后引用被释放。

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

        2
  •  1
  •   chila    14 年前

        3
  •  1
  •   jweyrich    14 年前

    正如奇拉已经回答的,只要你想,随时关闭插座是安全的。如果所讨论的套接字当时有一个未完成的操作,那么将调用处理程序/回调来通知您已取消该操作。这就是连接被中止的地方。

    至于你关于SyrdypTr的问题,如果你有一个线程或其他对象引用你的套接字,我认为这是一个很大的胜利,然而,在很多情况下它是不需要的。您所要做的就是动态地分配它们,并在不再需要它们时取消分配。当然,如果有其他对象或线程引用套接字,则必须在delete/dealloc之前更新它们。这样做可以避免无效的内存访问,因为它们所指向的对象不再存在(请参阅悬挂指针)。