UDP包字节读取粒度?

UDP packet bytes read granularity?

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

每个 "protocol packet" 包含 header 以及负载大小和负载本身。

每个 "protocol packet" 不超过 MTU 大小,预计没有碎片。

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

时序图:

  1. 客户端发送header(2字节)和负载(N < MTU-2字节)------>

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

  3. 服务器接收header,有效载荷大小

  4. 服务器尝试接收 N 字节的有效负载..... 没事了 。永远不会出现完成处理程序。

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

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

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

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

It is possible to read separate bytes of one UDP datagram sequentially by executing _socket.async_receive_from() sequentally.

如果这是一个陈述,它是不正确的,如果它是一个问题,答案是 'no'。 UDP 是一个数据报 protocol.You 得到整个数据报或什么都没有。如果您阅读了其中的一部分,则其余部分将被丢弃。

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