2014-02-24 70 views
4

我的问题:使用net.Read ...方法只复制给定字节数组或片的大小的字节数。我不想每次都分配64 kB的最大UDP数据报。转到:如何接收整个UDP数据报

有没有一种方法可以确定数据报的大小(数据报头中的数据报的大小)还是再次读取,直到数据报被完全读取?

+0

检查执行:直接执行socket.h提供的东西。所以别无选择。 – 0x434D53

+0

[这是另一个问题要求有关C接口的同样的事情](http://stackoverflow.com/questions/15446887/udp-read-data-from-the-queue-in-chunks) –

回答

1

尝试ReadFromUDP

func (c *UDPConn) ReadFromUDP(b []byte) (n int, addr *UDPAddr, err error) 

ReadFromUDP从C读出一个UDP包,复制有效载荷到b中。它返回复制到b中的字节数和包中的返回地址。

包大小应可从n,然后可以用它来定义自定义切片(或其它数据结构),以数据报存储在这依赖于在会话期间不改变数据报大小,它真的不应该。

+0

问题是:数据报大小发生变化,我实现了OSC(www.opensoundcontrol.org) - 这不是我的决定。我从来没有见过OSC数据报大于1024字节,但理论上... – 0x434D53

+0

不,它不像@ 0x434D53想要的那样工作。我正在寻找同样的事情。我需要的是头部的第5和第6个字节。它是一个16位的数字,最大值是65536 - 8.我花了一些时间来看代码,但它深入到linux内部。 为报头分配只有8个字节足以知道数据包真正需要的缓冲区的大小。 – tehmoon

0

通常在UDP协议中,数据包大小是事先知道的,它通常要小得多,大约在1.5k或更小。

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

+0

谢谢,是否担心。我完全想避免这一个额外的复制步骤。 – 0x434D53