【问题标题】:Is It safe to issue multiple async_send_to to in one udp socket?在一个 udp 套接字中发出多个 async_send_to 是否安全?
【发布时间】:2012-11-08 03:12:34
【问题描述】:

我正在用 boost::asio 编写一个 udp 广播服务器。 udp 数据包将从一个源端接收并广播到多个目的地。在单个线程中执行此类操作是否安全?

boost::asio::ip::udp::socket s;
MyHandler handler; // do nothing handler
MyBuffer buffer; //  buffer is allocated on heap and managed by smart ptr
...

s.async_send_to(buffer, destination1, handler);
s.async_send_to(buffer, destination2, handler);
s.async_send_to(buffer, destination3, handler);

或者我应该使用阻塞 send_to 代替吗?或者我应该链接它们,即在第一个 async_send_to 的完成处理程序中调用第二个 async_send_to?

【问题讨论】:

    标签: boost-asio


    【解决方案1】:

    文档说:

    虽然缓冲区对象可以根据需要被复制,但底层内存块的所有权由调用者保留,它必须保证它们在调用处理程序之前保持有效。

    如果缓冲区是在堆栈上分配的(即,它是在调用 async_send 的同一块中定义的)这很可能会损坏。因为调用所以 async_send 不会阻塞,一旦你从这段代码 sn-p 返回,内存将被释放。您可以将“缓冲区”设为类属性,以确保它在您需要时一直有效。但是,如果缓冲区在堆上,那就没问题了,代码会照原样工作。

    【讨论】:

    • 你是对的,但我在这里关心的不是缓冲区的生命周期(它在堆上分配并由引用计数的智能指针管理)。相反,我想确认在同一个 UDP 套接字上发出多个挂起的 async_send_to 操作是合法的、非法的还是未定义的行为?据我所知,即使在单个线程中对同一个 TCP 套接字发出多个 async_read 操作也是不安全的,因为 async_read 是一个组合操作,因此接收到的底层数据可能会在多个操作之间交错。
    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2011-05-04
    • 2011-07-25
    • 1970-01-01
    • 2011-12-05
    • 2011-03-19
    相关资源
    最近更新 更多