C++ boost::asio中对单个套接字的多次写入
我找不到任何关于在前一个完成之前尝试对boost::asio套接字进行第二次写入会发生什么的信息。这似乎是许多异步程序中可能发生的情况(因为在完成第一次写入之后,程序将在等待它完成之前继续,可能导致发送第二条消息,依此类推)。我想到了一些可能发生的事情(这是假设在所有情况下,消息都是通过一个对async_write的调用发送的) 因此,假设第一次发送不会导致错误:C++ boost::asio中对单个套接字的多次写入,c++,networking,boost-asio,C++,Networking,Boost Asio,我找不到任何关于在前一个完成之前尝试对boost::asio套接字进行第二次写入会发生什么的信息。这似乎是许多异步程序中可能发生的情况(因为在完成第一次写入之后,程序将在等待它完成之前继续,可能导致发送第二条消息,依此类推)。我想到了一些可能发生的事情(这是假设在所有情况下,消息都是通过一个对async_write的调用发送的) 因此,假设第一次发送不会导致错误: Asio按顺序发送msg1,然后发送msg2,即使在单个TCP数据包中也是可能的 第二个异步写入调用将一直阻塞,直到msg1完成
- Asio按顺序发送msg1,然后发送msg2,即使在单个TCP数据包中也是可能的
- 第二个异步写入调用将一直阻塞,直到msg1完成
- 结果未定义
如果不安全,那么让任何人编写某种简单的包装器来维护要发送的消息队列,一个接一个地发送消息,并在任何写入处理程序引发异常时中止?因此,对于正常的非阻塞套接字,您可以将一些依赖于实现的内容写入套接字,然后,最终写入操作将返回-ewoldblock,而不执行写入操作,以便稍后重试。翻看一下源代码,我发现Boost将其包装起来,因此您编写的所有内容最终都应该到达那里(或者引发错误,不包括will_block或重试)
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));
}