トップ回答者
POP3サーバからのメール受信でタイムアウトになってしまいます。

質問
-
こんにちは。
現在、WindowsCE5.0デバイスで動作する、POP3サーバからのメール受信アプリを作成しています。
環境は以下の通りです。
ターゲットOS :Windows CE 5.0
開発環境 :Visual Studio 2005
ネットワーク環境:docomoの3G回線
メール受信の仕組みは以下のようにしています。
1. System.Net.Sockets.TcpClient.GetStream()でネットワークストリームを取得
2. 1で取得したネットワークストリームから、System.IO.StreamReader.ReadLineで一行読み出し
としていますが、時々、2のReadLineが返ってこないことがあります。
そこで、
1. System.Net.Sockets.TcpClient.GetStream()でネットワークストリームを取得(これは同じ)
2. 1で取得したネットワークストリームのReadTimeOutプロパティを設定
としたのですが、2のReadTimeOutプロパティを設定するとSystem.Exceptionが発生してしまいました。
エラーメッセージは「タイムアウトはこのストリームでサポートされていません」となっています。
以下のサイトでは、ReadTimeOutプロパティは.Net Compact Framework 2.0でもサポートされていると記述されています。
http://msdn.microsoft.com/ja-jp/library/bk6w7hs8(v=vs.80).aspx
どちらが正しいのか、また、どのようにすればReadLineからちゃんと返ってくるようにできるか教えて頂けますでしょうか。
回答
すべての返信
-
- StreamReaderはバッファリングします。というのも1バイトずつ読み込んで改行コードかどうかを判断していては非効率だからです。
- バッファリングするということはStreamにとっては送信されてきた以上のデータを読み込む場合があるということです。
- それに対して、TcpClient.GetStream()で得られるNetwroskStreamはデフォルトでブロッキングモードです。これは要求されただけのデータが得られない場合にそこで停止し送信されてくるのを待つということになります。
ReadLine()が返ってこない原因はこの組み合わせにあります。NetworkStream.Socket.Blocking = falseとしてやれば3.が解消されます。
# この辺りは.NET Frameworkとは関係なく、ネットワークプログラミングの基本だと思います。
-
佐祐理さん
回答ありがとうございました。また、お礼がおそくなってしまいましてすみませんでした。
教えて頂いたNetworkStream.Socket.Blockingですが、.NET Compact Framework2.0ではサポートされていないようで
設定ができませんでした。(サイトには対象と書いてありますが、実際には設定できませんでした)
上記以外に何か方法はありますでしょうか?よろしくお願いいたします。
-
佐祐理さん
こんにちは。回答ありがとうございました。
「設定できませんでした」の件、説明不足ですみませんでした。
NetworkStream.Socket.Blockingのプロパティ自体がなく、設定ができなかったという事です。
アドバイス頂いた1バイトずつ読むというもも検討したのですが、たしかに非効率なので、別スレッドにして固まることを回避する事にしました。
こんな初心者で未熟者な私のために懇切丁寧に教えて頂きありがとうございました。
本当に助かりました!