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);
いくつかの問題が発生します。
カウント != 受け取ったカウント
これが私がチェックを行った理由ですが、発生する場合と発生しない場合があります..最大限の保証が必要です. カウントが異なるのは、バイト落ちやネットワークの問題が原因ではないことがわかりました。ヘッダーを受信しないことがあります-データのみで、4バイトを読み取ると、実際にデータの4バイトを読み取ったため、失敗しました。
データは時々ヘッダー をオーバーライドします。何故ですか?どうすればこれを解決できますか?
socket.Receive で次のエラーが発生することもあります。
データグラム ソケットで送信されたメッセージが、内部メッセージ バッファまたはその他のネットワーク制限よりも大きかったか、データグラムを受信するために使用されたバッファがデータグラム自体よりも小さかった
問題は、時々発生し、ほとんどの場合発生しないことです...私はそれをすべて最大バッファで受け取ることができます..しかし、そうするとメモリの問題が発生します。
これは、可能な限り高性能で保証された配信である必要があります..サーバー側はクライアント側に物理的に接続できないため、これは udp でなければなりません.これは、クライアントからサーバーへの一方向です.