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

时间:2014-02-24 10:09:50

标签: go udp

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

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

2 个答案:

答案 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或更小。

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