2012-09-27 8 views
6

スクリプト内のソケット接続を非ブロッキング接続に変更しています。チュートリアルでは、私は次の行を見つけました:Cで非ブロッキングソケット接続を使用する

x=fcntl(s,F_GETFL,0);    // Get socket flags 
fcntl(s,F_SETFL,x | O_NONBLOCK); // Add non-blocking flag 

私はソケットを作成してconnectステートメントの前に追加しました。それはもはやブロックしていない:)しかし、それはまた接続しません。私はエラーを取得していない、接続はちょうど-1を返しています。私がこれらの行をコメントアウトすると、それは接続します。

ノンブロッキング接続で接続するには、ほかに何が必要ですか?

答えて

6

connect(2)の戻り値を確認 - -1EINPROGRESSerrno(3)に設定する必要があります。その後、ソケットファイル記述子をポーリングセットに追加し、select(2)またはpoll(2)で待機します。

このようにして、複数の接続試行を同時に行うことができます(ブラウザなどのように)、タイムアウトを厳しくすることができます。

4

connectはおそらくすぐにEINPROGRESSエラーを返します。 selectの使用について読む。

TEMP_FAILURE_RETRYマクロで選択するように電話を折り返したい場合があります。

+0

ここでポイントは何ですか? * blocking * 'connect'とどう違うのですか? –

+0

@NikolaiNFetissov Fair point、私は、コードスニペットを誤解を招く可能性があると判断して削除し、TEMP_FAILURE_RETRYの使用を強調する答えを編集しました – simonc

関連する問題