【问题标题】:Multiple writes in boost::asio to a single socketboost::asio 中的多个写入到单个套接字
【发布时间】:2010-01-20 10:05:45
【问题描述】:

我找不到任何关于如果您尝试在前一个完成之前对 boost::asio 套接字进行第二次写入会发生什么。这似乎是在许多异步程序中可能发生的事情(因为在执行第一次写入之后,程序将在等待它完成之前继续,可能导致发送第二条消息等等)。我已经想到了一些可能发生的事情(假设在所有情况下,消息都是通过一次调用 async_write 发送的)。

void handleWrite(const boost::system::error_code&error)
{
    if(error)throw NetError(error);
}

vodi sendStuff()
{
    const char msg1 = "Red, Green, Blue";
    const char msg2 = "One, Two, Three";

    asio::async_write(socket,asio::buffer(msg1,sizeof(msg1)),boost::bind(&handleWrite,_1));
    //assume msg1 has still not been sent by the time we get here
    asio::async_write(socket,asio::buffer(msg2,sizeof(msg2)),boost::bind(&handleWrite,_1));
}

所以假设第一次发送不会导致错误:

  • Asio 按顺序发送 msg1,然后是 msg2,甚至可能在单个 TCP 数据包中
  • 第二个 async_write 调用阻塞,直到 msg1 完成
  • 结果未定义

如果 msg1s 发生错误,我假设异常也会导致 msg2 中止?

如果关联的 io_service 有一个线程池,还是只有一个线程,这是否也会受到影响?

如果不安全,那么是否有人编写了某种简单的包装器来维护要发送的消息队列,逐个发送它们并在任何写入处理程序抛出异常时中止?

【问题讨论】:

    标签: c++ networking boost-asio


    【解决方案1】:

    因此,使用普通的非阻塞套接字,您可以将一些依赖于实现的内容写入套接字,然后最终写入将返回 -EWOULDBLOCK 并且不执行写入,以便您稍后重试。在源代码中四处寻找告诉我 Boost 包装了它,因此您编写的所有内容最终都应该到达那里(或引发错误,不包括 will_block 或 try_again)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 2015-02-22
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      相关资源
      最近更新 更多