0

我正在阅读UDP daytime example来自 boost asio 的教程。它使用 arecv_buffer_和 usesasync_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 部分。

由于我们只提供 1 字节的 recv_buffer_ 来包含客户端的请求,因此如果客户端发送了更大的请求,io_service 对象将返回错误。如果出现这样的错误,我们可以忽略它。

但是无论如何都可以在没有缓冲区大小的情况下阅读整个消息?像循环receive_some每个字符并存储在字符串中?

4

1 回答 1

3

需要缓冲区大小。

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

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

于 2013-09-03T21:40:41.227 回答