Telnet 接続の遅延にプログラムで対処するにはどうすればよいですか?
質問
TcpClient クラスを利用して Telnet 接続を実装します。わからないのは、応答の終了を判断する方法です。DataAvailable プロパティが true になると、Stream からデータを読み取り、バッファーが別のデータのチャンクで満たされている間、DataAvailable が一時的に false に設定されるようですが、すべて読み込まれて消えてしまうと思います。すべての応答が読まれたことを確認するにはどうすればよいですか?
これを正しく動作させるために、以下のコード スニペットを変更する方法をアドバイスしてください。応答全体を取得する時間が十分にあるため、コードをステップ実行すると正しく動作します。あなたの助けに感謝。
if (this.Stream.DataAvailable)
{
readBuffer = new Byte[this.Client.ReceiveBufferSize];
do
{
// read data
bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);
Thread.Sleep(10);
responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString(readBuffer, 0, bytes));
} while (this.Stream.DataAvailable);
allDataRead = true;
break;
}
解決
TelnetのようなアプリケーションのためのTCP接続では、送信の終わりというような概念はありません。あなたは、多くの場合、ユーザーがそれらを入力し、それが改行を取得し、通常時に、アクションを実行する時期を決定するために、サーバーにアップだとして時に各キー押下1を送信するTelnetクライアントを見つけることができます。他のクライアントは、いくつかのクライアントキーの押下をバッファリングし、一度にすべてを送ることができます。
あなたのアプリのルックスによって、あなたは行を探しているべきである伝送の終わりを示すために、フィードます。
do
{
bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);
responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString (readBuffer, 0, bytes));
} while (this.Stream.DataAvailable && !responseData.Contains("\n"));
他のヒント
この目的で DataAvailable を使用するのは得策ではないと思います。応答の終わりは、プロトコルで指定されているとおりです。
内容を読み取るには Read などのブロッキング呼び出しを使用し、確立したプロトコルを使用して、より多く、どのくらい読み取るかを決定することをお勧めします。Read はすべてのデータが読み取られたときに返されるのではなく、一部のデータが読み取られたときに返されるため、必要なデータがすべて返されるわけではない可能性があります。そのため、どれだけ読み取られたかを確認する必要があります。
プロトコルが Telnet の場合は、端末で受信したバイトをエコーしたり、コマンドなどを処理したりする場合と同様に、受信したすべてのバイトに応答する必要があるでしょう。
DataAvailable は、呼び出されたときに Read がブロックされるかどうかを確認するのに適していると考えられます (バッファー内の内容を返します) が、ループが単純ではなくなります。
これはつまり、あなたがtelnetサーバに接続しているか「のtelnet」でされ、実際のtelnet接続ですあなたは本当に「TCP / IPソケット」を意味するのですか?
最初の送信が完了すると、サーバは接続をドロップするかどうかを決定します。もしそうなら、あなたは単に、ストリームの最後まで読むことができます。そうでなければ、そうでない場合は、読み込みが完了したかどうかを決定するためのデータでキューを使用する必要があるとしています。あなたは私たちがより直接的な答えを与えることができるかもしれプロトコルに私たちを啓発することができので、もし異なるプロトコルは、この点で異なる方法で動作します。 (受信機が受信するまで読み込む応答の終わりを区切るためにマーカーを使用して、他の応答の先頭のバイト/文字の数(受信機は、単にその多くのバイト/文字を読み込み)、または含む:アプローチは、一般的に2つの陣営に落ちます区切り)。