UDP包字节读取粒度?
UDP packet bytes read granularity?
我有 UDP 客户端和服务器应用程序,以及基于 UDP 的自定义协议。
每个 "protocol packet" 包含 header 以及负载大小和负载本身。
每个 "protocol packet" 不超过 MTU 大小,预计没有碎片。
目前我正在使用 ASIO 库并遇到一些问题:
时序图:
客户端发送header(2字节)和负载(N < MTU-2字节)------>
服务器只读取 2 个字节,以确保负载大小。
服务器接收header,有效载荷大小
服务器尝试接收 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()
,可以让您分散阅读。
我有 UDP 客户端和服务器应用程序,以及基于 UDP 的自定义协议。
每个 "protocol packet" 包含 header 以及负载大小和负载本身。
每个 "protocol packet" 不超过 MTU 大小,预计没有碎片。
目前我正在使用 ASIO 库并遇到一些问题:
时序图:
客户端发送header(2字节)和负载(N < MTU-2字节)------>
服务器只读取 2 个字节,以确保负载大小。
服务器接收header,有效载荷大小
服务器尝试接收 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()
,可以让您分散阅读。