none
POP3サーバからのメール受信でタイムアウトになってしまいます。 RRS feed

  • 質問


  • こんにちは。

    現在、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からちゃんと返ってくるようにできるか教えて頂けますでしょうか。
    2013年4月18日 5:29

回答

  • 「設定できませんでした」とはどう設定できなかったのでしょうか?

    既に原因は説明してありますから、ReadLine()を使わず、1バイトずつ読み込めばブロックされることもないとは思いますが…さすがに非効率ですね。

    # そういえば通信帯域が貴重なはずなのにWindows Phone 7ではHTTP圧縮をサポートしていないとか、さりげに肝心なところが抜けてるんでしたっけ。

    2013年4月24日 8:17

すべての返信

    1. StreamReaderはバッファリングします。というのも1バイトずつ読み込んで改行コードかどうかを判断していては非効率だからです。
    2. バッファリングするということはStreamにとっては送信されてきた以上のデータを読み込む場合があるということです。
    3. それに対して、TcpClient.GetStream()で得られるNetwroskStreamはデフォルトでブロッキングモードです。これは要求されただけのデータが得られない場合にそこで停止し送信されてくるのを待つということになります。

    ReadLine()が返ってこない原因はこの組み合わせにあります。NetworkStream.Socket.Blocking = falseとしてやれば3.が解消されます。

    # この辺りは.NET Frameworkとは関係なく、ネットワークプログラミングの基本だと思います。

    • 回答の候補に設定 星 睦美 2013年4月23日 2:40
    • 回答の候補の設定解除 星 睦美 2013年4月24日 8:27
    2013年4月18日 7:09
  • 佐祐理さん

    回答ありがとうございました。また、お礼がおそくなってしまいましてすみませんでした。

    教えて頂いたNetworkStream.Socket.Blockingですが、.NET Compact Framework2.0ではサポートされていないようで
    設定ができませんでした。(サイトには対象と書いてありますが、実際には設定できませんでした)

    上記以外に何か方法はありますでしょうか?

    よろしくお願いいたします。

    2013年4月24日 6:08
  • 「設定できませんでした」とはどう設定できなかったのでしょうか?

    既に原因は説明してありますから、ReadLine()を使わず、1バイトずつ読み込めばブロックされることもないとは思いますが…さすがに非効率ですね。

    # そういえば通信帯域が貴重なはずなのにWindows Phone 7ではHTTP圧縮をサポートしていないとか、さりげに肝心なところが抜けてるんでしたっけ。

    2013年4月24日 8:17
  • 佐祐理さん

    こんにちは。回答ありがとうございました。

    「設定できませんでした」の件、説明不足ですみませんでした。

    NetworkStream.Socket.Blockingのプロパティ自体がなく、設定ができなかったという事です。

    アドバイス頂いた1バイトずつ読むというもも検討したのですが、たしかに非効率なので、別スレッドにして固まることを回避する事にしました。

    こんな初心者で未熟者な私のために懇切丁寧に教えて頂きありがとうございました。

    本当に助かりました!

    2013年4月25日 4:32