Previous Next Table of Contents

6. 高度なソケットプログラミング

6.1 ソケットを非ブロックモードにするにはどうするのですか?

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 を使ってフラグを設定します。

ああそうそう、フラグはどんな方法でもお好きな方法で変更できます。

6.2 connect() にタイムアウトを入れるにはどうすればよいのでしょうか?

Andrew Gierth 氏 ( andrew@erlenstar.demon.co.uk) は select()connect() を使用する以下のような手順を概説してくれました。 これは connect() 呼び出しにおいてタイムアウトを入れることが できるようにします。

もしコネクションが成功すれば:

もしコネクションが失敗すれば:

これを例証するサンプルコードは、socket-faq のプログラム例の connect.c のファイルに見ることができます。


Previous Next Table of Contents