[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



柳澤です。

On Tue, 11 Jul 2006 14:21:21 +0900
SATOH Kiyoshi <satoh0@xxxxxxxxx> 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 <yanagisawa@xxxxxxxxxxxxxxxxxxx>
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@xxxxxxxxxxxxxxxxxxxx
http://lists.sourceforge.jp/mailman/listinfo/postfix-jp-list

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

[検索ページ] [Postfix-JP ML Home]