前往:如何接收完整的UDP数据报

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

是否可以确定数据报的大小(在数据报头中)还是重新读取直到完全读取数据报? </ p>
</ div>

展开原文

原文

My Problem: With net.Read... Methods copy only the number of bytes of the size of the given byte-array or slice. I dont want to allocate the maximum UDP datagram of 64 kB every time of course.

Is there a go way to determine the size of the datagram (which is in the datagram header) or read again until the datagram is completely read?

udp
dry9192
dry9192 这是另一个关于C接口的问题
6 年多之前 回复
duana1021
duana1021 检查执行:Go直接执行socket.h提供的内容。所以别无选择。
6 年多之前 回复

2个回答



尝试 ReadFromUDP :</ p>

  func(c * UDPConn)ReadFromUDP(b [] byte)(n int,addr * UDPAddr,err error)
</ code > </ pre>



ReadFromUDP从c读取UDP数据包,并将有效负载复制到b。 它返回复制到b中的字节数以及数据包上的返回地址。</ p>
</ blockquote>
</ blockquote>

数据包大小应可从< 代码> n </ code>,然后您可以使用它定义存储数据报的自定义切片(或其他数据结构)。这依赖于会话期间数据报大小不变,这实际上是不应该的。 / p>
</ div>

展开原文

原文

Try ReadFromUDP:

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

ReadFromUDP reads a UDP packet from c, copying the payload into b. It returns the number of bytes copied into b and the return address that was on the packet.

The packet size should be available from n, which you can then use to define a custom slice (or other data structure) to store the datagrams in. This relies on the datagram size not changing during the session, which it really shouldn't.

down100009
down100009 不,它无法像@ 0x434D53那样工作。 我在找同样的东西。 我需要的是标头中的第5和第6个字节。 它是一个16位数字,最大值为65536-8。我花了一些时间看代码,但是它对linux内部结构的了解太深了。 仅为标头分配8个字节就足以知道数据包真正需要的缓冲区大小。
接近 3 年之前 回复
douji2283
douji2283 问题是:数据报大小改变,我实现了OSC(www.opensoundcontrol.org)-这不是我的决定。 我从没见过野外大于1024字节的OSC数据报,但是从理论上讲...
6 年多之前 回复



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

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

展开原文

原文

Usually in a UDP protocol packet sizes are known in advance, and it's usually much smaller, in the order of 1.5k or less.

What you can do is preallocate a maximum size static buffer for all reads, then once you know the size of the datagram you've read from the socket, allocate a byte array with the actual size and copy the data to it. I don't think you can do extra reads of the same datagram.

douhao6271
douhao6271 谢谢,没有担心。 我确实想避免这一额外的复制步骤。
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问