4

以下のコードは、同時UDP送信を受け入れるのに十分ですか?より具体的には、2つのクライアントが同時に送信する場合、DatagramSocketは送信をキューに入れて、receive()を呼び出すときに1つずつ配信しますか、それとも1つだけが通過しますか?

DatagramSocket socket = new DatagramSocket(port, address);
byte[] buffer = new byte[8192];

while(!disconnect){

    DatagramPacket p = new DatagramPacket(buffer, buffer.length);
    socket.receive(p);
}
4

3 に答える 3

3

デフォルトではキューイングはありません。クライアントは、タイムアウトまたは同様の値に達するまで再試行できます。UDP は静かで高速ですが、負荷が高いとクライアントが接続できない場合があります。

于 2013-01-25T06:49:40.617 に答える
0

パケットがネットワーク インターフェイスに到達すると (輻輳したワイヤレス チャネルで失われたパケットを想像してください)、パケットは通過し、ブロッキング メソッドsocket.receive(p)が呼び出されます。2 つのクライアントが同時に送信しているためにチャネル上でパケットの衝突が発生した場合、2 つのパケットのいずれも取得できません。ただし、ネットワーク インターフェイスのアクセス テクノロジがこれを処理するため、これはおそらく不可能です 。CSMA/CAまたはCSMA/CDを確認してください。

呼び出した後socket.receive(p)、パケット自体を処理する新しいスレッドを作成する必要があります。これにより、ソケットで次のパケットを確実に受信できるようになります。

編集: INTEL の TX および RX 記述子の説明

于 2013-01-25T07:44:30.540 に答える