0

UDP クライアントと UDP サーバーがあります。udp クライアントとサーバーは実際には物理的に切断されています。そのため、メッセージは udp サーバーにしか送信できませんが、データが適切に受信されたかどうかの確認を取得できません。

私がやっていることは、送信しようとしているデータの量を指定する 4 バイトのヘッダーを送信することです。そして先ほど送ったサイズ通りにデータを読み込みます。

クライアント側

// Sending Header(header is the size of the data)
byte[] header = BitConverter.GetBytes(data.Count());
socket.SendTo(header, 0, header.Count(), SocketFlags.None, outEP);
// Sending Data
socket.SendTo(data, 0, data.Count(), SocketFlags.None, outEP);

サーバ側

// Receiving input size
int receivedCount = socket.EndReceive(result);
// Header is filled on BeginReceive
Int32 count = BitConverter.ToInt32(header, 0);
if(count != receivedCount) throw;
// Then I receive the count relevent
socket.Receive(data, 0, count, SocketFlags.None);

いくつかの問題が発生します。

  1. カウント != 受け取ったカウント

    これが私がチェックを行った理由ですが、発生する場合と発生しない場合があります..最大限の保証が必要です. カウントが異なるのは、バイト落ちやネットワークの問題が原因ではないことがわかりました。ヘッダーを受信しないことがあります-データのみで、4バイトを読み取ると、実際にデータの4バイトを読み取ったため、失敗しました。

    データは時々ヘッダー をオーバーライドします。何故ですか?どうすればこれを解決できますか?

  2. socket.Receive で次のエラーが発生することもあります。

    データグラム ソケットで送信されたメッセージが、内部メッセージ バッファまたはその他のネットワーク制限よりも大きかったか、データグラムを受信するために使用されたバッファがデータグラム自体よりも小さかった

    問題は、時々発生し、ほとんどの場合発生しないことです...私はそれをすべて最大バッファで受け取ることができます..しかし、そうするとメモリの問題が発生します。

    これは、可能な限り高性能で保証された配信である必要があります..サーバー側はクライアント側に物理的に接続できないため、これは udp でなければなりません.これは、クライアントからサーバーへの一方向です.

4

2 に答える 2

1

UDPを使用する場合は双方向通信が必要であり、パケットの損失、二重化、または無秩序がないことを確認してください。PGM -Pragmatic Multicast
のようなプロトコルを見たことがありますか? さらに、ネットワークスタックをすばやくクリーンアップし、データをキューまたはその他のメモリデータ構造にポストするためだけに、単一のスレッドが必要になる場合があります。ネットワークスタックは、想像できるよりもはるかに小さく、想像以上に高速です。 編集:UDPの問題は、定義上、受信者がそれらを検出した場合でも、パックを紛失または複製したり、順序を変更したりする可能性があることです。通信が不可能な場合、受信者はそれらを修正するように要求する必要があります。

于 2012-06-25T12:49:55.933 に答える
1

UDPは、パケットが送信された順序で到着すること(またはパケットが到着すること)を保証しません。何かが上書き/上書きされるのではないかと思います。ヘッダーとペイロードを1つのパケットで送信する必要があります。

TCPの使用を検討しましたか?UDPの方が高速であると主張するかもしれませんが、自分でパケットの調整を実装しようとすると、その利点が失われます。( UDPでなければならないことを見逃しました)。

TCP(ネットワーク層が再送信を処理する)またはSIP over UDP(ソフトウェアが再送信を処理する)を見ると、失われたパケットを検出して再送信する手段があります。たとえば、パケットに番号を付けて、受信者に各パケットの受信を確認させることができます。

于 2012-06-25T11:53:12.390 に答える