中川と申します。

> 1.6.8の ext/socket/socket.c を斜め読みしてみましたが、ruby_connect()の
> 中で、non-blockingモードでconnect(2)を繰り返しています。
> 
> SOCK_DGRAMなソケットは別ですが、SOCK_STREAMなconnect(2)って複数回呼び
> 出せるものでしたっけ?  non-blockingモードでEINPROGRESSが返ってきた場合
> はselect(2)やpoll(2)みたいなので完了を検知するしかないような気もします。

non blocking モードの connect(2) を複数回実行することは可能
です。最初の connect(2) は EINPROGRESS エラーとなり、その後、
コネクションが確立するまでは EALREADY エラーとなります。コネ
クション確立後であれば connect(2) が EISCONN エラーとなりま
す。

これを利用して、select(2) や poll(2) などで writable を待ち
合わせるのではなく、connect(2) が EISCONN エラーとなることで、
コネクションの確立を判断する、といったアプリケーションもたま
に見かけます。


---
Tetsuo NAKAGAWA <tet / suken.jp>