我的问题:使用net.Read ...方法只复制给定字节数组或切片大小的字节数。我当然不希望每次都分配64 kB的最大UDP数据报。
是否有办法确定数据报的大小(在数据报头中)或再次读取,直到完全读取数据报?
答案 0 :(得分:1)
尝试ReadFromUDP:
func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err error)
ReadFromUDP从c读取UDP数据包,将有效负载复制到b中。它返回复制到b中的字节数和数据包上的返回地址。
数据包大小应该来自n
,您可以使用它来定义用于存储数据报的自定义切片(或其他数据结构)。这依赖于会话期间不会更改的数据报大小,它真的不应该。
答案 1 :(得分:0)
通常在UDP协议中,数据包的大小是事先已知的,并且通常要小得多,大约为1.5k或更小。
您可以做的是为所有读取预分配最大大小的静态缓冲区,然后一旦知道从套接字读取的数据报的大小,就分配一个具有实际大小的字节数组并将数据复制到它。我认为你不能对同一数据报做额外的读取。