UDP 数据包字节读取粒度?



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

每个"协议数据包"都包含有效载荷大小的标头,以及有效载荷本身。

每个"协议数据包"不超过MTU大小,期望缺少分段。

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

时间表 :

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

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

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

  4. 服务器试图接收 N 字节的有效负载..... 什么都没有.永远不会发生完成处理程序 。

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

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

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

会很高兴得到帮助, 提前谢谢.

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

如果这是一个陈述,它是不正确的,如果它是一个问题,答案是"否"。UDP 是一种数据报协议。您可以获得整个数据报或什么都没有。如果您阅读其中的一部分,则其余部分将被丢弃。

可能您正在寻找readv()recvmsg(),它们允许您分散阅读。

最新更新