UDP数据包字节读取粒度?

Posted

技术标签:

【中文标题】UDP数据包字节读取粒度?【英文标题】:UDP packet bytes read granularity? 【发布时间】:2017-10-10 04:47:40 【问题描述】:

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

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

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

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

时间图:

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

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

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

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

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

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

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

很高兴得到帮助, 提前致谢。

【问题讨论】:

服务器如何读取这2个字节?而且,接收读取处理程序对传输的字节说了什么?我的猜测是这次读取会获取所有数据,而不仅仅是两个字节。 2 个字节正确接收,“传输的字节数”正好包含 _socket.async_receive_from() 请求的 2 个字节。所以我需要有人来确认我的担忧,而且看起来已经有一些解释了。谢谢。 【参考方案1】:

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

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

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

【讨论】:

感谢您的解释。在我的情况下,“每次一个数据报”是比部分阅读更好的解决方案。因为每一个协议包都是自给自足的,并且协议的大小

以上是关于UDP数据包字节读取粒度?的主要内容,如果未能解决你的问题,请参考以下文章

udp Socket 发送缓冲区 最大可以为多大

构造UDP数据包的字节数组

来自 socket() 的 UDP 数据包标头与预期不符

浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)

丢弃大于 1500 字节的 UDP 数据包

UDP数据报的最小长度是多少 UDP数据报的