我正在读这样的boost::asio::ip::udp::socket
:
using boost::asio::ip::udp;
// ...
char recv_buf[128];
udp::endpoint sender_endpoint;
size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint);
现在,这完全正常,但我能够接收的最大字符数现在是127.但是我遇到了一个问题因为我需要接受一些数据输入,其长度可以大大改变(并且是例如,没有带有前缀标题的明确定义的长度。对此的解决方案是动态扩展缓冲区,如向量。是否有可能创建一个动态扩展的boost::asio::buffer
来接受(理论上)有用量的输入并将其存储在容器中?
答案 0 :(得分:5)
UDP数据报大小并没有太大变化:它永远不会大于65535,在8字节标题之后为65,527字节的数据留出空间。
答案 1 :(得分:1)
如果使用较小的缓冲区,可以通过* BufferSequences概念轻松地将它们链接在一起。例如,您可以传入MutableBufferSequence 接受来自read(2)调用的数据或传递ConstBufferSequence以获取要写入的缓冲区列表(2)。也就是说,我倾向于建议在每个方向使用单个缓冲区,因为它往往会简化代码(虽然这并不总是可行)。
答案 2 :(得分:0)
似乎没有动态调整大小的任何规定。而且不会有意义。想想会发生什么:
因此,有一个动态大小的缓冲区是没有意义的。正如Cubbi指出的那样,无论如何UDP数据报的最大大小都很小,所以只需将缓冲区设置为系统中最大的有效消息,然后再使用它。
答案 3 :(得分:0)
Boost 1.66.0添加了dynamic_buffer
,可以调整对std::string
或std::vector<CharType>
的引用: