バックグラウンド:
私がプログラミングしているアプリケーションは、非同期ソケット (BeginSend、EndSend、BeginReceive、EndReceive を使用) を使用して相互にデータを送信します。ソケットは TCP であり、IPV4 ではソケット フラグはありません。
これは、4 バイト (int) のメッセージを送信するシステムを使用し、その後に前のメッセージで指定された長さのメッセージが続きます。MessageLength と MessageBody を処理する関数ヘルパーを使用します。流れはこんな感じ
- BeginReceive()
- EndReceive()
- MessageLengthReceived()
- BeginReceive()
- MessageBodyReceived()
問題:
ファイルデータを16kbのチャンクで送信すると、問題が発生します(オフセット、pieceIndexなどの小さなオーバーヘッドが追加されます)。MessageLength を受信するときに、実際のメッセージの長さではなく、前のメッセージのランダムな部分からデータを受信することがあります。この問題の一部は、設定されたオフセット (ファイルの先頭または末尾 / ピース / 16 kb のチャンクなど) で常に発生するとは限らず、どのファイルでも発生する可能性がありますが、より多くのファイルや大きなファイルを送信するとさらに発生する可能性があります。 .
この問題が発生しない内部メッセージ (RequestMessages など) が送信されます。すべての内部メッセージは 100 バイト未満です。
別のチャンクを要求する前に、ファイル チャンクが完全に保存されるのを待ってみましたが、それでも失敗します。また、一度に送信するチャンクの数を制限しようとしましたが、これは 127.0.0.1 (ローカル クライアント) を使用する場合にのみ問題を解決し、クロス ネットワーク (LAN) では解決しません。
アプリケーションに問題がないかどうかを確認するために何時間も費やしましたが、間違ったデータをヘッダーとして送信する場所はまだ確認していません。この問題は常に、2 つのクライアントの送信と受信の間にあるようです。使用すべきソケット/送信方法の設定はありますか? または、ある種の競合状態である可能性があります (競合状態について考えましたが、データがファイル内のどこにでもランダムに存在する可能性があるという事実により、これを再考しました)。