6

NetworkStream.DataAvailable は、送信者の送信バッファが空かどうかを認識していますか? それとも、受信側の読み取りバッファにデータがあるかどうかを単に示していますか? 私の推測は後者です...

具体的には、進行中の会話を含む一部のソケット作業では、現在、受信者が現在のバッチ内のデータ量を正確に把握できるように、長さプレフィックスを使用しています。ただし、代わりに NetworkStream.DataAvailable を使用することを提案する .patch が送信されました。私の懸念は、これは送信者が最初に送信したものではなく、受信者が何を持っているかを教えてくれるだけだということですが、私はソケットの専門家ではありません。

私が間違っている?それとも、length-prefix が進むべき道ですか?

(複数のバッチが同じ接続で送信されるため、ストリームが閉じられるまで単純に Read() できないことに注意してください。各バッチを個別に扱うことが重要です。1 つのバッチで読みすぎた場合 (たとえそれがバッファリングされて破棄されます)、会話は中断されます)。

4

2 に答える 2

5

接続の一方の側は、もう一方の側の送信バッファが空であるかどうかを認識しません。

DataAvailable読み取る受信データがあるかどうかのみを示します。の前にそれを使用することもできますがRead()、それだけでは必要な情報が得られません。各バッチの開始と終了はわかりません。

以前に前後の会話をコーディングし、データに長さプレフィックスを使用しました。私がしたことは、正確なバイト数(一度にチャンク)を読み取るだけのヘルパー関数を作成することでした。

ストリーム内のバッチの長さの値に代わる唯一の方法は、受信データを調べて、バッチの開始と終了を認識する方法です。

于 2008-10-03T15:22:51.023 に答える
2

受信者が特定のメッセージのすべてのデータをいつ受信したかを知る必要がある場合は、必ずプレフィックスの長さを設定する必要があります。

私は通常、これに似た構造体を定義し、送信するバイナリ メッセージの前に出ます。

struct Header
{
  int packetIdentifier;
  int protocolVersion;
  int messageType;
  int payloadSize;
}

識別子により、プロトコル タイプの有効なメッセージがあるかどうかを判断できます。このバージョンにより、プロトコルを改訂できます。メッセージ タイプは、メッセージのタイプです (つまり、CommsOnline)。ペイロード サイズは、メッセージの本文のサイズです。

于 2008-10-03T17:06:44.230 に答える