【问题标题】:boost asio udp async_read_from buffersizeboost asio udp async_read_from 缓冲区大小
【发布时间】:2013-09-02 16:17:05
【问题描述】:

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

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

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

【问题讨论】:

  • 也许这是为了按字节接收字节?
  • "由于我们只提供 1 字节的 recv_buffer_ 来包含客户端的请求,所以如果客户端发送了更大的内容,io_service 对象将返回错误。如果出现此类错误,我们可以忽略。" (来自您的链接)
  • 感谢指点。我错过了帽子点。这里有像receive_some 这样的东西吗?它将循环接收到的消息直到它结束并继续附加到缓冲区?这样我就不需要保留固定大小的缓冲区了?

标签: c++ boost boost-asio


【解决方案1】:

需要一个缓冲区大小。

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

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

【讨论】:

  • When the message size is less than that of the buffer。你真的是说更大吗?
  • @Dmitry,是的。谢谢。
猜你喜欢
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2015-04-19
相关资源
最近更新 更多