6

スクリプトのソケット接続をノンブロッキング接続に変更しています。チュートリアルで、次の行を見つけました。

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

そのため、ソケットを作成した後、connect ステートメントの前にそれらを追加しました。そして、それはもはやブロックされていません:)しかし、それも接続しません。エラーは発生しません。接続は -1 を返すだけです。これらの行をコメントアウトすると、接続されます。

接続するための非ブロッキング接続を取得するには、他に何を追加する必要がありますか?

4

2 に答える 2

6

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

このようにして、複数の接続試行を同時に実行し(たとえば、ブラウザーがそれを実行する方法)、タイムアウトをより厳しくすることができます。

于 2012-09-27T15:14:40.213 に答える
4

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

おそらく、SELECT の呼び出しをTEMP_FAILURE_RETRYマクロでラップする必要があることに注意してください。

于 2012-09-27T15:09:37.753 に答える