In message <200308160517.h7G5HcPL012839 / sharui.nakada.kanuma.tochigi.jp>
	on Sat, 16 Aug 2003 14:17:39 +0900,
	nobu.nakada / nifty.ne.jp wrote:
> > 実はエラーだった場合は、getsockopt(2)をSOL_SOCKETレベルとSO_ERRORで呼
> > び出してエラーの状態を取得するとECONNREFUSEDだったとわかります。しかし、
> > 続けてconnect(2)を呼ぶとEINVALになって、ほんとうの理由はわかりません。
> 
> SO_ERRORでerrnoを調べるというのは、今でもやってるんですが、これ
おぉ、そうでしたか。手元で別途テストプログラムで確認したところ、

> がEINVALだけではなくてEINPROGRESSのときにも必要ということでしょ
> うか。

一応はだいじょうぶです。ただ、connect(2)をループで繰り返しているなら、
(必須ではないかもしれませんが)EINPRROGRESSのときもやった方が良いと言え
ます。早くエラーが検知できて、connect(2)の呼び出しを1回節約できる場合
があります。

P.S.
connect(2)でEINVALが発生する場合を書いてあるのを、どなたか見たことはあ
りますか?  NetBSDでは前のメールに書いたとおり記述がありません。OpenBSD
3.3では、

     [EINVAL]      A TCP connection with a local broadcast, the all-ones or a
                   multicast address as the peer was attempted.

となっていて、なんか違う場合に思えます。EINVALを返すこと自体が実はバグ
なのかもしれません。(少なくともオンライン・マニュアルに載っていないこ
とはsend-prする価値がありそうです。)

-- 
神戸 隆博 / Takahiro Kambe