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数据包字节读取粒度?的主要内容,如果未能解决你的问题,请参考以下文章