代码之家  ›  专栏  ›  技术社区  ›  Fire Lancer

Boost::ASIO中的多个写入到单个套接字

  •  2
  • Fire Lancer  · 技术社区  · 15 年前

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

    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包中也是可能的。
    • 在msg1完成之前,第二个异步写调用块
    • 结果未定义

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

    如果相关的IO服务有一个线程池,或者只有一个线程,这是否也会影响?

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

    1 回复  |  直到 15 年前
        1
  •  1
  •   Andrew McGregor    15 年前

    因此,对于正常的非阻塞套接字,您可以将一些依赖于实现的量的内容写入套接字,然后最终写入将返回-ewouldBlock,而不是执行写入操作,以便稍后重试。在源代码中四处搜索告诉我Boost包装了这一点,所以您编写的所有内容最终都应该到达那里(或者引发一个错误,不包括阻塞或再次尝试)。