c++ - boost asio udp async_read_from buffersize

标签 c++ boost boost-asio

我正在阅读 UDP daytime example来自 boost asio 教程。它使用 recv_buffer_ 并使用 async_receive_from() 来运行接收循环。

socket_.async_receive_from(
    boost::asio::buffer(recv_buffer_), remote_endpoint_,
    boost::bind(&udp_server::handle_receive, this,
      boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));

我不明白的是

boost::array<char, 1> recv_buffer_;

为什么它的大小是一?如果收到的消息长度超过一个字节怎么办?

编辑

正如@Guy Sirton 指出的那样,我错过了该页面中写的 hsi 部分。

Since we only provide the 1-byte recv_buffer_ to contain the client's request, the io_service object would return an error if the client sent anything larger. We can ignore such an error if it comes up.

但是有没有办法在没有缓冲区大小的情况下读取整个消息呢?比如按每个字符循环 receive_some 并存储在字符串中?

最佳答案

需要缓冲区大小。

UDP 保留消息边界。当从套接字中读取数据时,它会读取到消息边界,即使提供的缓冲区的大小小于消息。当消息大小大于缓冲区的大小时,错误代码将设置为 boost::asio::error::message_size

要么分配一个足够大的缓冲区来读取最大预期消息大小,要么使用 react 器式操作来 lazily allocate缓冲区。

关于c++ - boost asio udp async_read_from buffersize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18577259/

相关文章:

c++ - 搜索当前类实例的 boost::bimap

c++ - 为什么这个boost::asio::tcp::socket可以重复使用?

c++ - 如何将 int 复制到 boost/std::char 数组?

C++ 将输入字符串解析为变量

C++(11) "High Performance"并发单个写入器

使用 Boost 对复杂数据进行 C++ 序列化

boost io_service.accept : Get URI called

C++在不使用字符串流的情况下读取具有任意长度和格式的行的多行文件

c++ - 缩放 Qt3D 的相机

C++ 指针加法被乘