Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::asio中对单个套接字的多次写入_C++_Networking_Boost Asio - Fatal编程技术网

C++ boost::asio中对单个套接字的多次写入

C++ boost::asio中对单个套接字的多次写入,c++,networking,boost-asio,C++,Networking,Boost Asio,我找不到任何关于在前一个完成之前尝试对boost::asio套接字进行第二次写入会发生什么的信息。这似乎是许多异步程序中可能发生的情况(因为在完成第一次写入之后,程序将在等待它完成之前继续,可能导致发送第二条消息,依此类推)。我想到了一些可能发生的事情(这是假设在所有情况下,消息都是通过一个对async_write的调用发送的) 因此,假设第一次发送不会导致错误: Asio按顺序发送msg1,然后发送msg2,即使在单个TCP数据包中也是可能的 第二个异步写入调用将一直阻塞,直到msg1完成

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

因此,假设第一次发送不会导致错误:

  • Asio按顺序发送msg1,然后发送msg2,即使在单个TCP数据包中也是可能的
  • 第二个异步写入调用将一直阻塞,直到msg1完成
  • 结果未定义
如果msg1s中发生错误,我假设异常也会导致msg2中止

这是否也受关联io_服务是否有线程池或只有一个线程的影响


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

因此,对于正常的非阻塞套接字,您可以将一些依赖于实现的内容写入套接字,然后,最终写入操作将返回-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));
}