1
來自C socket()
/recv()
背景,Java的DatagramSocket.receive API似乎有點奇怪。爲什麼強迫程序員分配一個足夠大的輸入數據的DatagramPacket
?Java:爲什麼DatagramSocket的`receive`方法會截斷消息?
來自C socket()
/recv()
背景,Java的DatagramSocket.receive API似乎有點奇怪。爲什麼強迫程序員分配一個足夠大的輸入數據的DatagramPacket
?Java:爲什麼DatagramSocket的`receive`方法會截斷消息?
這個問題是基於一個錯誤的前提。在C語言中,爲recv
系統調用的簽名是:
ssize_t recv(int s, void *buf, size_t len, int flags);
注意,你傳遞一個指針到緩衝區,並且緩衝區的長度。手冊條目然後說:
如果消息太長,無法放入提供的緩衝區,根據接收消息的套接字的類型,可能會丟棄多餘的字節。
換句話說,在C API預計呼叫者分配一個「足夠大的」緩衝區,可能截斷更長......就像Java那樣的消息。
那麼,C中的行爲是什麼? – 2011-02-07 00:43:11
這是一個很好的問題......直到現在我還是假設`recvfrom`會繼續返回剩餘的數據,但實驗證明我錯了。請參閱@Stephen C的回答。 – 2011-02-07 02:17:53