質問

Tcp Echo Serverの例を読んだことがありますが、不明瞭な点がいくつかあります。

TcpClient client = null;
NetworkStream netStream = null;

try {
  client = listener.AcceptTcpClient(); 
  netStream = client.GetStream();

  int totalBytesEchoed = 0;
  while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) {
    netStream.Write(rcvBuffer, 0, bytesRcvd);
    totalBytesEchoed += bytesRcvd;
  }

  netStream.Close();
  client.Close();
} catch {
  netStream.Close();
}

サーバーがパケットを受信すると(whileループ)、データをrcvBufferに読み取り、ストリームに書き込みます。

私を混乱させるのは、コミュニケーションにおけるメッセージの時系列順です。 netStream.Write()で書き込まれたデータは、すぐにクライアントに送信されます(クライアントはまだ送信中の場合もあります)か、ストリームに既に書き込まれたデータが(クライアントによって)処理された後にのみです。

次の質問で以前のことを明確にすることもできます:クライアントがストリームに書き込むことでデータを送信する場合、そのデータはサーバー側のメッセージキューに移動されて読み取りを待機しているので、ストリームは実際には「空」ですか?サーバーがすぐにストリームに書き込むことができる理由を説明します-ストリームからのデータは実際に他の場所でバッファリングされているため...?

役に立ちましたか?

解決

ヒント:NetworkStream.Readメソッド呼び出しは、この例ではブロックしています。

この本は完全に正しいです。TCPストリームへの生のアクセスは、余分な「チャンク」を意味しません。また、たとえばこの例では、一度に1バイトを簡単に処理できます。ただし、読み取りと書き込みをバッチで実行すると(通常は公開バッファーを使用)、より効率的な処理が可能になります(多くの場合、システムコールが少なくなるため)。ネットワーク層とネットワークハードウェアも独自の形式のバッファを使用しています。

実際には、Write()から書き込まれたデータが実際にさらにReads()が正常に完了する前に書き込まれるという保証はありません:ある層でデータがフラッシュされても、別の層でフラッシュされることを意味せず、絶対に保証はありませんデータがクライアントに戻されたことを確認します。これは、より高レベルのプロトコルが作用する場所です。

このエコーの例では、データは可能な限り高速で単純に突き抜けられます。書き込みと読み取りの両方が、基礎となるネットワークスタック(特に送信バッファーと受信バッファー)に基づいてブロックされ、それぞれが独自の一連のバッファーを持ちます。

[これは少し物事を単純化します。実際のパケットフローに伝送特性を課すTCP [プロトコル]自体を常に見ることができます。]

他のヒント

TCP接続は、原則として全二重です。したがって、2つの別々のチャネルを扱っていることになります。はい、両方が同時に書いている可能性があります。

技術的には、Read()操作を実行するとき、回線からビットを読み取っていないのは正しいことです。基本的に、バッファリングされたデータ(TCPによって受信され、正しい順序で配置されたチャンク)を読み取っています。送信時には、理論上はすぐにデータを送信するはずのFlush()を使用できますが、最新のTCPスタックには、適切なサイズのパケットでデータを収集してワイヤにバーストする方法が少しあります。

ヘンク・ホルターマンが説明したように、TCPは全二重プロトコルであり(基盤となるすべてのインフラストラクチャでサポートされている場合)、データの送受信はサーバー/クライアントがデータを読み書きする場合に多くなります。サーバーがデータを送信するときとは異なり、クライアントはすぐにデータを読み取ります。クライアントは自身のデータを送信してからRead()を実行できます。この場合、データはネットワークバッファーに長くとどまり、しばらくして誰も読みたくない場合に破棄されます。少なくとも、supa dupaサーバー/クライアントライブラリ(-。

を扱うときにこれを経験しました。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top