UDP数据包字节读取粒度?

时间:2017-05-11 09:06:08

标签: networking udp boost-asio asio

我有UDP客户端和服务器应用程序,以及UDP上的自定义协议。

每个“协议数据包”包含有效负载大小的报头,以及有效负载本身。

每个“协议数据包”不超过MTU大小,期望没有碎片。

目前我正在使用ASIO库并遇到一些问题:

时间图:

  1. 客户端发送头(2个字节)和有效载荷(N

  2. 服务器只读取2个字节,以确保有效负载大小。

  3. 服务器接收有效负载大小的标头

  4. 服务器TRIED接收N个字节的有效载荷..... 没别的了 。完成处理程序永远不会发生。

  5. 如果客户端发送(用于调试目的)另外一个数据包,则会触发服务器完成处理程序 - 这就是为什么我认为asio的异步循环没问题。

    此外,如果服务器尝试读取每个读取的整个传输2 + N个字节, 收到的所有数据。

    所以我有点困惑。通过顺序执行_socket.async_receive_from(),可以顺序读取一个UDP数据报的单独字节。

    很乐意提供帮助, 提前谢谢。

1 个答案:

答案 0 :(得分:1)

  

通过顺序执行_socket.async_receive_from(),可以顺序读取一个UDP数据报的单独字节。

如果这是一个声明它是不正确的,如果这是一个问题答案是'不'。 UDP是一种数据报协议。您可以获得整个数据报,或者根本没有。如果你阅读其中的一部分,剩下的就被丢弃了。

可能您正在寻找readv()recvmsg(),这样您就可以分散阅读。