2005-09-05 [長年日記]

[Q3] IMAP4のセッション切断の検出

最近、IMAP4のセッションが切断されたのを検出できなくなっていたのを直しました。で、なぜ気づかなかったかというと、自分ではForceDisconnectを指定して一定時間以上経ったセッションは捨てていたからだったので、これではいかんだろうと指定を外してみました。そうしたらいきなり検出に失敗しました;_;。

どうも、その環境ではIMAP4サーバ側がセッションをタイムアウトさせる前に、NATの経路情報が時間経過によって消えてしまうためのようです。NATの経路情報が消えると、TCP的にFINが送られたわけでもRSTが送られたわけでもないので、ソケット的には繋がっている状態と変わらず、タイムアウトを0にしてselectをかけてもシグナル状態のソケットはないという答えが返ってきてしまいますし、実際にrecvしてみないとエラーになるかどうかはわからないようです。

そもそもアイドル中にはNOOPを定期的に送るとかサーバからの通知を処理するとかいう必要があるのですが、ひとまずアイドル状態になっていたセッションを使いまわす場合には、コマンドレベルでエラーが発生したらセッションをつなげ直して再試行するようにした方が良いかもしれません。

[]