我正在阅读 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/