2011-02-06 83 views
1

來自C socket()/recv()背景,Java的DatagramSocket.receive API似乎有點奇怪。爲什麼強迫程序員分配一個足夠大的輸入數據的DatagramPacketJava:爲什麼DatagramSocket的`receive`方法會截斷消息?

+0

那麼,C中的行爲是什麼? – 2011-02-07 00:43:11

+0

這是一個很好的問題......直到現在我還是假設`recvfrom`會繼續返回剩餘的數據,但實驗證明我錯了。請參閱@Stephen C的回答。 – 2011-02-07 02:17:53

回答

4

這個問題是基於一個錯誤的前提。在C語言中,爲recv系統調用的簽名是:

ssize_t recv(int s, void *buf, size_t len, int flags); 

注意,你傳遞一個指針到緩衝區,並且緩衝區的長度。手冊條目然後說:

如果消息太長,無法放入提供的緩衝區,根據接收消息的套接字的類型,可能會丟棄多餘的字節。

換句話說,在C API預計呼叫者分配一個「足夠大的」緩衝區,可能截斷更長......就像Java那樣的消息。

相關問題