【发布时间】:2021-10-16 21:08:26
【问题描述】:
我的问题:使用 net.Read... 方法只复制给定字节数组或切片大小的字节数。我当然不想每次都分配最大 64 kB 的 UDP 数据报。
是否有go的方式来确定数据报的大小(在数据报头中)或再次读取直到数据报被完全读取?
【问题讨论】:
-
检查了实现:Go 直接实现了 socket.h 提供的功能。所以别无选择。
我的问题:使用 net.Read... 方法只复制给定字节数组或切片大小的字节数。我当然不想每次都分配最大 64 kB 的 UDP 数据报。
是否有go的方式来确定数据报的大小(在数据报头中)或再次读取直到数据报被完全读取?
【问题讨论】:
试试ReadFromUDP:
func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err error)
ReadFromUDP 从 c 读取一个 UDP 数据包,将有效负载复制到 b。它返回复制到 b 中的字节数和数据包上的返回地址。
数据包大小应该可以从n 获得,然后您可以使用它来定义一个自定义切片(或其他数据结构)来存储数据报。这依赖于数据报大小在会话期间不会改变,它真的不应该。
【讨论】:
通常在 UDP 协议中数据包的大小是预先知道的,并且通常要小得多,大约为 1.5k 或更小。
你可以做的是为所有读取预先分配一个最大大小的静态缓冲区,然后一旦你知道你从套接字读取的数据报的大小,分配一个具有实际大小的字节数组并将数据复制到它。我不认为你可以对同一个数据报进行额外的读取。
【讨论】: