Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Programming UNIX Sockets in C - Frequently Asked Questions: 高度なソケットプログラミング
Previous
Next
Table of Contents
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() 呼び出しにおいてタイムアウトを入れることが
できるようにします。
- コネクト成功: コネクションの作成に成功した(これは通常、自
分自身にコネクトしたときにのみ起こる)
- コネクト失敗: 明らか
- コネクトが -1/EINPROGRESS を返す。コネクション要求は始まっ
たが、まだ完了していない。
もしコネクションが成功すれば:
- ソケットは select() で書き込み可能となる(そしてデータが到
着すれば読み込み可能にもなるでしょう)。
もしコネクションが失敗すれば:
- ソケットは select で読み込み可能 *かつ* 書き込み可能となる
が、read と write のどちらも要求コネクションからのエラーコードを
返す。また、エラー状態を得るのに getsockopt(SO_ERROR) を使うこと
もできますが、これは注意してください。システムによっては
getsockopt の結果のパラメータの中にエラーコードが返されますが、
別の(正しくない)システムでは getsockopt *呼び出し自身* が失敗し、
エラーとして値が格納されます。
これを例証するサンプルコードは、socket-faq のプログラム例の
connect.c のファイルに見ることができます。
Previous
Next
Table of Contents