Go:如何接收整个UDP数据报

Go:如何接收整个UDP数据报,go,udp,Go,Udp,我的问题是:用net.Read。。。方法只复制给定字节数组或片大小的字节数。当然,我不想每次都分配64KB的最大UDP数据报 是否有办法确定数据报的大小(在数据报报头中)或重新读取,直到数据报被完全读取 通常在UDP协议中,数据包的大小是预先知道的,并且通常要小得多,大约为1.5k或更小 您可以做的是为所有读取预先分配一个最大大小的静态缓冲区,然后一旦您知道从套接字读取的数据报的大小,就用实际大小分配一个字节数组,并将数据复制到其中。我认为你不能对同一个数据报进行额外的读取 试试看: ReadF

我的问题是:用net.Read。。。方法只复制给定字节数组或片大小的字节数。当然,我不想每次都分配64KB的最大UDP数据报


是否有办法确定数据报的大小(在数据报报头中)或重新读取,直到数据报被完全读取

通常在UDP协议中,数据包的大小是预先知道的,并且通常要小得多,大约为1.5k或更小

您可以做的是为所有读取预先分配一个最大大小的静态缓冲区,然后一旦您知道从套接字读取的数据报的大小,就用实际大小分配一个字节数组,并将数据复制到其中。我认为你不能对同一个数据报进行额外的读取

试试看:

ReadFromUDP从c读取UDP数据包,将有效负载复制到b。它返回复制到b中的字节数和数据包上的返回地址


数据包大小应该可以从
n
中获得,然后您可以使用它定义一个自定义切片(或其他数据结构)来存储数据报。这取决于数据报的大小在会话期间不会改变,这是不应该的。

谢谢,我确实担心这一点。我确实想避免这一额外的复制步骤。问题是:数据报大小改变,我实现OSC(www.opensoundcontrol.org)——这不是我的决定。我在野外从未见过大于1024字节的OSC数据报,但理论上……不,它不像@0x434D53所希望的那样工作。我也在找同样的东西。我需要的是标题中的第5和第6个字节。它是一个16位数字,最大值为65536-8。我花了一些时间研究代码,但它太深入了linux内部。只为头分配8个字节就足以知道数据包真正需要的缓冲区大小。检查了实现:Go直接实现socket.h提供的内容。所以别无选择。
func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err error)