2006年7月11日

[postfix-jp: 2151] Re: sleep中にコネクションが切断されたことを検出したい

さとうです。

On Tue, 11 Jul 2006 15:19:12 +0900
Yoshisato YANAGISAWA wrote:
Subject: [postfix-jp: 2150] Re: sleep中にコネクションが切断されたことを検出したい

> この説明によるとvstream_feofやvstream_ferrorは直前に実施した操作でEOFや
> エラーが置きているかをしらべる関数のようですね。


 んー、確かにそう書かれてますね。
 もうちょっと見たらわかることなのに、良く確認せずに書いてすみません。

> vstream_feofを呼んだ場合もvstream_ferrorを呼んだ場合もvbufにあるフラグの
> チェックしかしていないため、これらを呼び続けても同じ結果しか返さない

 確認しました。確かに、読んでるだけでフラグが変更されないので、同じ結果
だけしか返りませんね。

> 実装はしていませんが、アイディアとして一言言うなれば、
> こういう実装はどうでしょう?
>
> 1. わざとここでVSTREAM_GETC(以下略してgetc)を呼出す
> 2. if (greet pauseのタイムアウト時間を経過)
> タイムアウトして続きの処理を行う
> else /* Greet Pauseで指定した時間より前に何かの処理が行われた */
> case getcで何かのデータが取れた場合:
> Improper Pipeliningということで504終了。
> case getcでデータが取れなかった場合:
> if (vstream_feofあるいはvstream_ferrorがtrue)
> 相手が接続を閉じたと判断して接続を終了
> else
> getcがなんらかの理由でタイムアウトしたと判断して
> 経過時間分を減じて2の最初のif文からやりなおし。

 確かにこれならいけそうかも。
 というか自分もこれに近いことは考えて、でも、なにかデータ取れちゃったと
きにどうしよう、と思ってやめたんですが、こっちが返して無いうちになんか送っ
てきてたら504で終了、とすることで、あまり大きな修正にせずにすみますね。

> 何故selectが出てきたか良くわかりませんが、
> close(2)やshutdown(2)してくれた場合には検出できると思います。
> しかし、vstream_feofやvstream_ferrorだけではなくvstream_freadや
> VSTREAM_GETCなんかも呼ばないとEOFやエラーというフラグは立たないと
> 思います。

 良く覚えてないんですが、selectってタイムアウト時間の設定って出来ません
でしたっけ?それで自動的に切れたときには、shutdownしたのと同じにしてくれ
るのかなと思いまして。
 なんにしても、読むか書くかしないと、フラグの更新がされないわけですね。

 大変参考になりました。ちょっと試してみます。


--
佐藤 潔 (SATOH Kiyoshi) http://d.hatena.ne.jp/stealthinu/

_______________________________________________
Postfix-jp-list mailing list
Postfix-jp-list@xxxxx
http://lists.sourceforge.jp/mailman/listinfo/postfix-jp-list

投稿者 xml-rpc : 2006年7月11日 15:43
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/39364
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。