私はすでにスタックオーバーフローをグーグルで検索しましたが、私の問題に関連するものは何も見つかりません。
まず、簡単にシーンを説明します。
UDP によってネットワークを介して JPEG のすべての時間部分 (今後は「チャンク」と呼びます) を送信するカメラを想像してみてください。UDP の使用は制約です。それを変更することはできません。「なぜ TCP を使用しないのですか?」という質問には答えないでください。
一方、クライアントはカムから送信されたチャンクを受信します。一種のフロー制御を構築するために、データグラムの先頭に 3 つのフィールド (JPEG 番号、チャンク インデックス、チャンクの量を格納するための 3 バイト) を設定し、その後にチャンク自体を設定しました。
現時点では、ループバック(127.0.0.1)を介して送受信する自分のラップトップで両側をテストしていますが、問題は、カメラ(送信者)がすべてのチャンクを適切に送信したと言っている間です(単一のJPEGでテストしています) 161 個のチャンクに分割される画像) クライアントはランダムな数の断片 (70 近くの場合もあれば、100 の場合もあれば、すべての場合もある) を受け取ります。rawcap (http://www.netresec.com/?page=RawCap) を使用してループバックをスニッフィングしようとしましたが、161 (送信されるはずの) とは異なる別の量の UDP 'データグラム' が検出されました。クライアントが受け取ったと主張する金額。
では、送信文が期待どおりに機能していない可能性はありますか? 調査を続けるための他の提案はありますか?
これが私の送信方法です。
private void startSendingData(IPEndPoint target)
{
fatherForm.writeMessage("START command received. Sending data to " + target.Address.ToString() + " port " + target.Port.ToString() + "...");
//Get chunks prepared
List<byte[]> listOfChunks = getChunksInAList(collectFiles());
List<uint> chunksSucces = new List<uint>();
List<uint> chunksFailed = new List<uint>();
byte[] stopDatagram = getStopDatagram();
//Initialise the socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Stopwatch sw = Stopwatch.StartNew();
foreach (byte[] chunk in listOfChunks)
{
if (s.SendTo(chunk, target) == chunk.Length)
chunksSucces.Add(BitConverter.ToUInt32(chunk,sizeof(uint)));
else
chunksFailed.Add(BitConverter.ToUInt32(chunk, sizeof(uint)));
}
Debug.WriteLine(chunksSucces.Count + " sent successfully");
//Tell the receiver not to continue receiving
s.SendTo(stopDatagram, target);
long ellapsedMs = sw.ElapsedMilliseconds;
sw.Stop();
writeTransmissionRate(listOfChunks.Count, ellapsedMs);
Debug.WriteLine(sw.ElapsedMilliseconds + "ms ellapsed");
sw.Stop();
s.Close();
}
出力は次のとおりです。
161 chunks to be sent
161 sent successfully
6ms ellapsed
Transmission rate: 37000.65KB/s 36.13MB/s
しかし、反対側では、このテストで 22 個のデータグラムしか受信できませんでした。
前もって感謝します。