2014-02-24 73 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