2012-02-20 11 views
0

TcpClientおよびNetworkStreamを使用して、認証用のPOPサーバーへの接続を開始しています。悪い習慣、学習に良い。不正な文字列を返すTcpClientを持つStreamReader

私は、POPサーバーにTelnet接続すると、生成された応答が最初である:

+OK Dovecot Ready 

ユーザーは、ユーザー名

+OK 

ユーザーが有効-N

ない場合場合 +OKをチェックされているパスに入る入り

私のプログラムはPOPサーバーに接続し、StreamReaderとWriterを開き、すべてを書き込みますこのデータを確認し、応答を確認します。

using (TcpClient client = new TcpClient("host.university.ie", 110)) { 
     using (NetworkStream stream = client.GetStream()) { 
     using (StreamReader reader = new StreamReader(stream)) { 
     using (StreamWriter writer = new StreamWriter(stream)) { 
      string response = reader.ReadLine(); 
      writer.Write("USER " + username); 
      response = reader.ReadLine(); 
      writer.Write("PASS " + password); 
      string response = reader.ReadLine(); 
      Response.Write(@"<script language='javascript'>alert('The following response as been received: \n" + response + " .');</script>"); 
      isValid = response[ 0 ].Equals('+'); 
      writer.WriteLine("quit\n"); 
     } 
     } 
     } 
    } 
    } 

ただし、このコードを入力すると、クエリは無限ループに入ります。わかりやすいことは、reader.ReadLine()への呼び出し回数を1つに減らすと、 "+ OK Dovecot Ready"を返します。 POPサーバーに接続していますが、この後は動作しません。誰かがこれを引き起こしている可能性のあるアイディアを持っていますか?

+0

を使用しようとするが、ここで使用されるように正しい用語を「ループ」となっていますか?どのようにループが発生する可能性があるかは、コードからは分かりません。 – spender

答えて

2

いいえ、無限ループではありません。サーバーにUSERコマンドの送信が完了していないため、reader.ReadLine()への2回目の呼び出しは返されません。

writer.WriteLine("USER " + username); 
writer.Flush(); 

と、これを::

writer.WriteLine("PASS " + password); 
writer.Flush(); 

EDIT:spenderさんの提案どおり.Flushに追加しました通話をあなたはこれを試してみてください.WriteLine代わり.Write

で使用して改行文字を送信する必要があります。

+0

私はこれを無駄にしようとしました。私は変更しました.WriteLineに書き込み、それでも無限ループします。 –

+0

'.WriteLine()'を呼び出すたびに '.Flush()'を追加してみてください –

+0

ありがとう! :)それは今、完璧に動作しています、2分でこの答えを受け入れます! –

1

@ atornbladの回答に加えて、ストリームに書き込んで応答が必要な場合は、writer.Flush()を検討してください。

0

チェックしてください:ストリーム上CanWriteとCanReadをし、あなたのエンコーディングを確認してください。 ください:http://msdn.microsoft.com/de-de/library/system.net.sockets.tcpclient.getstream.aspx

さらにいくつかの質問: どこ無限ループがありますか?私はあなたのコードでループを見ることができません。 ReadLineはブロックメソッドです。たぶん、行末の文字の問題ですか?文字の出力を得るには、代わりにRead()を試してください。

"+ OK Dovecot Ready"はどこから返されますか?あなたのGuiにある場合は、GUIスレッドが次のReadLine()呼び出しをブロックすることでブロックされるため、結果を表示する要素の.Refreshを呼び出そうとします。

これは目的別ですか?

writer.WriteLine("quit\n"); 

これは、2重線終端につながります。

そして

.Flush() after writing to your stream. 
+0

ReadLineはPOPサーバーとの通信に完全に合理的です。そして、 "+ OK Dovecot Ready"を返すのはPOPサーバーです。これは明らかにWebアプリケーションなので、.Refreshを呼び出す要素はなく、GUIスレッドもありません。 –