如何连接两个 boost::asio::streambuf?

7

我使用 boost::asio 作为网络框架。它使用 boost::asio::streambuf 作为读写介质。我想要:

  • 在一个缓冲区中读取一些消息
  • 将第二个缓冲区附加到第一个缓冲区的开头
  • 发送新的组合消息

有哪些可能的高效(零拷贝)选项来完成这个任务?

2个回答

8

这个原理被称为“散布/聚集IO”。它基本上是一种同时传输多个缓冲区(按顺序)的方法,而不需要昂贵的内存复制。在boost::asio中,它得到了很好的支持,使用了非常灵活和强大的缓冲区概念和缓冲区序列概念(buffer-sequence concept),但这些概念也很难理解。

下面是一个简单的例子(未经测试,但我认为是正确的),可以帮助你入门:

std::vector<boost::asio::streambuf::const_buffers_type> buffers;
buffers.push_back( my_first_streambuf.data() );
buffers.push_back( my_second_streambuf.data() );

std::size_t length = boost::asio::write( mySocket, buffers );

当然,一个简单的选项是将两条消息都读入流缓冲区中,然后只需发送整个流缓冲区即可。但从你的问题中推断,由于某些原因,这似乎不是一个选择?


0

asio::buffer 自由函数可以接受一个缓冲区集合(例如 this),得到的缓冲区不是缓冲区的副本,而是一个序列 - 将被发送。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接