2011-02-06 13 views
1

C socket()/recv()の背景から、Java DatagramSocket.receive APIはちょっと変わったようです。プログラマが受信データ用に十分な大きさのDatagramPacketを割り当てるように強制するのはなぜですか?Java:DatagramSocketの `receive`メソッドがメッセージを切り捨てるのはなぜですか?

+0

したがって、Cの動作は何ですか? –

+0

これは良い質問です...今まで私は 'recvfrom'が残りのデータを引き続き返すと仮定していましたが、実験は私が間違っていることを証明しています。 @Stephen Cの答えに対するコメントを参照してください。 –

答えて

4

この質問は、誤った前提に基づいています。 Cにおいて、recvシステムコールのための署名がある:

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

もしバッファへのポインタを渡す注、そのバッファの長さ。

メッセージが長すぎて、指定されたバッファに収まらない場合は、メッセージが受信されたソケットのタイプによって余分なバイトが破棄されることがあります。言い換えれば

、CのAPIは、呼び出し側は「十分な大きさ」のバッファを割り当てることを期待し、長いメッセージを切り捨てることがあります... Javaはありません同じように。

+0

私のシステムのマニュアルページは、余分なバイトが破棄されるときにはっきりとしたものではありません...しかし、反映されると、UDPはストリーミングしていないので、未読部分を試して保存するのは賢明ではありません'recvfrom'への次の呼び出しでそれを返します。そして、速い実験によって、これが真であることが証明されました。助けてくれてありがとう。 –

関連する問題