Networking UDP数据包字节读取粒度?

Networking UDP数据包字节读取粒度?,networking,udp,boost-asio,asio,Networking,Udp,Boost Asio,Asio,我有UDP客户端和服务器应用程序,以及UDP上的自定义协议 每个协议包都包含带有有效负载大小的报头,以及有效负载本身 每个协议数据包不超过MTU大小,预计不会出现碎片 目前我正在使用ASIO库,遇到一些问题: 时间图: 客户端发送头2字节和有效负载N 服务器只读取2个字节,以确定负载大小 具有有效负载大小的服务器接收标头 服务器试图接收N字节的有效负载。。。。。 什么也没有。完成处理程序从不发生 若客户端为了调试的目的再发送一个数据包,服务器完成处理程序就会被触发——这就是为什么我认为asio的

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

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

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

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

时间图:

客户端发送头2字节和有效负载N

服务器只读取2个字节,以确定负载大小

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

服务器试图接收N字节的有效负载。。。。。 什么也没有。完成处理程序从不发生

若客户端为了调试的目的再发送一个数据包,服务器完成处理程序就会被触发——这就是为什么我认为asio的异步循环是可以的

另外,若服务器试图读取整个传输,则每次读取2+N字节, 收到所有数据

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

我很乐意帮助你, 提前谢谢

通过依次执行_socket.async_receive_,可以顺序读取一个UDP数据报的单独字节

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


您可能正在寻找readv或recvmsg,它们允许您分散读取。

服务器如何读取这两个字节?对于传输的字节,接收读取处理程序会说什么?我的猜测是,此读取获取所有数据,而不仅仅是两个字节。正确接收的2个字节,传输的字节正好包含_socket.async_receive_from请求的2个字节。所以我需要有人来证实我的担忧,看起来已经有一些解释了。谢谢,谢谢你的解释。在我的例子中,每次一个数据报是比部分读取更好的解决方案。由于协议的每个数据包都是自给自足的,并且协议的大小