我有UDP客户端和服务器应用程序,以及UDP上的自定义协议。
每个“协议数据包”包含有效负载大小的报头,以及有效负载本身。
每个“协议数据包”不超过MTU大小,期望没有碎片。
目前我正在使用ASIO库并遇到一些问题:
时间图:
客户端发送头(2个字节)和有效载荷(N
服务器只读取2个字节,以确保有效负载大小。
服务器接收有效负载大小的标头
服务器TRIED接收N个字节的有效载荷..... 没别的了 。完成处理程序永远不会发生。
如果客户端发送(用于调试目的)另外一个数据包,则会触发服务器完成处理程序 - 这就是为什么我认为asio的异步循环没问题。
此外,如果服务器尝试读取每个读取的整个传输2 + N个字节, 收到的所有数据。
所以我有点困惑。通过顺序执行_socket.async_receive_from(),可以顺序读取一个UDP数据报的单独字节。
很乐意提供帮助, 提前谢谢。
答案 0 :(得分:1)
通过顺序执行_socket.async_receive_from(),可以顺序读取一个UDP数据报的单独字节。
如果这是一个声明它是不正确的,如果这是一个问题答案是'不'。 UDP是一种数据报协议。您可以获得整个数据报,或者根本没有。如果你阅读其中的一部分,剩下的就被丢弃了。
可能您正在寻找readv()
或recvmsg()
,这样您就可以分散阅读。