Andrew Gierth 氏 ( andrew@erlenstar.demon.co.uk) より:
fcntl(soc, F_SETFL, O_NONBLOCK)
は他のファイルフラグを全て
潰してしまうので、技術的には正しくありません。ですが一般的にはそ
のようにして逃げています。それはその他のフラグ(例えば
O_APPEND
) はソケットに対してはほとんど当てはまらないからで
す。同様に手荒な調子でブロックモードに戻すのには fcntl(soc,
F_SETFL, 0)
を使います。
これを正しく行なうには、F_GETFL
を使って現在のフラグを取得
し、O_NONBLOCK
フラグをセットあるいはリセットし、そして
F_SETFL
を使ってフラグを設定します。
ああそうそう、フラグはどんな方法でもお好きな方法で変更できます。
Andrew Gierth 氏
(
andrew@erlenstar.demon.co.uk) は select()
と
connect()
を使用する以下のような手順を概説してくれました。
これは connect()
呼び出しにおいてタイムアウトを入れることが
できるようにします。
もしコネクションが成功すれば:
もしコネクションが失敗すれば:
これを例証するサンプルコードは、socket-faq のプログラム例の
connect.c
のファイルに見ることができます。