【发布时间】:2013-12-05 15:28:19
【问题描述】:
是否可以通过 Boost Asio 获取 UDP 数据报的长度? UDP 标头有一个指定 UDP 数据包长度的字段。是否可以通过 Boost Asio 获得此值?如果不是,如何确定数据包的长度?
【问题讨论】:
标签: c++ header udp boost-asio packet
是否可以通过 Boost Asio 获取 UDP 数据报的长度? UDP 标头有一个指定 UDP 数据包长度的字段。是否可以通过 Boost Asio 获得此值?如果不是,如何确定数据包的长度?
【问题讨论】:
标签: c++ header udp boost-asio packet
asio 允许您在执行读取时绑定完成处理程序。完成处理程序的参数之一是数据包长度。
您的读取完成处理程序必须满足http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/ReadHandler.html 中指定的要求
例如查看http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp03/echo/async_udp_echo_server.cpp。在对async_receive_from 的调用中,您指定读取完成后要调用哪个完成处理程序:
socket_.async_receive_from(
boost::asio::buffer(data_, max_length), sender_endpoint_,
boost::bind(&server::handle_receive_from, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
因此,当执行完成处理程序handle_receive_from 时,asio 会将读取的字节大小传递给处理程序。
void handle_receive_from(const boost::system::error_code& error,
size_t bytes_recvd)
【讨论】:
receive 和receive_from 也有该信息作为它们的返回值。如果你想知道而不实际读取数据,你可以使用available,但这不会返回下一个数据报的大小,而是在套接字上等待读取的字节数。
available() 返回下一个数据报的字节数。微妙的细节是available() 返回可用于读取 的字节数,而receive() 只会将单个数据报出列。
available() 来检查我的套接字是否有多个数据报等待检测我的服务器在写入接收到的数据包时是否太慢。我猜我很幸运,那从未发生过,因为服务器会忘记它。