2

a を使用して aStreamWriterに書き込み、NetworkStreamaを使用しStreamReaderて応答を読み取ります。アプリはニュース サーバーにコマンドを送信し、応答を読み取ります。

簡略化されたコード (エラー処理などを除く):

tcpClient = new TcpClient();
tcpClient.Connect(Name, Port);

networkStream = tcpClient.GetStream();
serverReader = new StreamReader(networkStream, Encoding.Default);
serverWriter = new StreamWriter(networkStream, Encoding.ASCII) {
                     AutoFlush = true
                   };

// reads the server's response to the connect:  "200 news.newsserver.com"
// commenting out these lines doesn't solve the problem
while (serverReader.Peek() > -1) {
    serverReader.ReadLine();
}

serverWriter.WriteLine("authinfo user username");

// expect response "381 more authentication required", but code just blocks
string response = serverReader.ReadLine();

コードは最後の行でブロックされ、おそらくネットワーク ストリームが応答を送信するのを待っています。

を使用してタイムアウト ループを設定することでアプリのハングを回避できますserverReader.Peek()が、常にタイムアウトします。私は決して応答を得ません。

サーバーとポートに telnet で直接接続してコマンドを入力すると、すぐに応答が返ってきます。

serverWriter.Flush()プロパティを使用する代わりに明示的に呼び出すとAutoFlush、ブロックされて応答が返されません。

このアプローチを使用してサーバーへの応答が得られない理由はありますか?

ありがとう!

解決済み:

上記のコード私にとってはうまくいくので、戻ってそのコードに基づいて、機能しないコードを構築しました。

ハングするコードでは、まだ serverReader.Peek() でタイムアウト ループを使用していました。Peek() は、バッファに読み取るデータがあっても、常に -1 を返します!! Peek() ループを ReadLine() へのブロッキング呼び出しに置き換えると、問題が解決します。

アプリがマルチスレッドであり、ブロックしたくないため、タイムアウトループを最初に入れました。この問題を再検討し、Peek() を使用せずにスレッドのタイミングを解決する方法を確認する必要があります。

みんなありがとう、良い答え!

4

3 に答える 3

6

それが問題だとは思いませんStreamWriterが、簡単に調べる方法があります。WireSharkをダウンロードして、実際にネットワーク上で何が行われているかを確認してください。これは、何が起こっているのかを知る最も簡単な方法です。

于 2009-09-11T19:31:43.073 に答える
1

上記のコード私にとってはうまくいくので、戻ってそのコードに基づいて、機能しないコードを構築しました。

ハングするコードでは、まだ serverReader.Peek() でタイムアウト ループを使用していました。Peek() は、バッファに読み取るデータがあっても、常に -1 を返します!! Peek() ループを ReadLine() へのブロッキング呼び出しに置き換えると、問題が解決します。

アプリがマルチスレッドであり、ブロックしたくないため、タイムアウトループを最初に入れました。この問題を再検討し、Peek() を使用せずにスレッドのタイミングを解決する方法を確認する必要があります。

みんなありがとう、良い答え!

于 2010-08-10T17:24:27.213 に答える