0

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

每个“协议包”都包含带有有效负载大小的标头,以及本身的有效负载。

每个“协议数据包”不超过 MTU 大小,预计不会出现碎片。

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

时间图:

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

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

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

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

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

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

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

很高兴得到帮助,在此先感谢。

4

1 回答 1

1

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

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

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

于 2017-05-11T09:54:34.350 回答