2

如果您在前一个完成之前尝试对 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 有一个线程池,还是只有一个线程,这也会受到影响吗?

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

4

1 回答 1

1

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

于 2010-01-20T10:19:16.477 回答