2006年7月11日

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


柳澤です。

On Tue, 11 Jul 2006 14:21:21 +0900
SATOH Kiyoshi wrote:

>  それで質問なのですが、vstream_feof や vstream_ferror では、接続が切
> れたことを確認することは出来ないのでしょうか。


src/util/vstream.cより

/* vstream_feof() returns non-zero when a previous operation on the
/* specified stream caused an end-of-file condition.
/*
/* vstream_ferror() returns non-zero when a previous operation on \
the
/* specified stream caused a non-EOF error condition, including \
timeout.

これは2.2.10のものなので最近のは違うかも知れませんが、
この説明によるとvstream_feofやvstream_ferrorは直前に実施した操作でEOFや
エラーが置きているかをしらべる関数のようですね。

そして、さらに調べてみるとやはりI/Oなしにこれらの関数を呼んでもEOFや
エラーとは判定してくれないようです。
これらの関数はsrc/util/vstream.hにマクロとして定義されていて、
このマクロはsrc/util/vbuf.hで定義されているマクロを利用しています。
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文からやりなおし。


>  socketでの通信を考えると、送信側がshutdownしてくれないと切断を検知す
> ることが出来ないような気もします。
>  (切断テストをしたプロセスのkillではなく)selectでタイムアウト時間を設
> 定している場合には、shutdownがされると考えて良いのでしょうか。

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

--
-------------------------------------------------------
Yoshisato YANAGISAWA
Dept. of Mathematical and Computing Sciences,
Graduate School of Information Science and Engineering,
Tokyo Institute of Technology.
_______________________________________________
Postfix-jp-list mailing list
Postfix-jp-list@xxxxx
http://lists.sourceforge.jp/mailman/listinfo/postfix-jp-list

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




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