我正在阅读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
并存储在字符串中吗?
答案 0 :(得分:1)
需要缓冲区大小。
UDP保留邮件边界。从套接字读取数据时,即使提供的缓冲区的大小小于消息,它也将读取到消息边界。当消息大小大于缓冲区大小时,错误代码将设置为boost::asio::error::message_size
。
分配足够大的缓冲区以读取最大预期消息大小,或者使用reactor样式操作来缓冲区lazily allocate。