2010-11-22 9 views
1

select()のすべてのドキュメントから理解したところでは、send()のソケット(ディスクリプタ)の可用性をチェックするためにfd_setを書いていると思われます成功したノンブロッキングconnect()の試行を検出するにはどうすればいいですか?connect()またはaccept()の成功後にソケットが使用できなくなったのはいつですか? それは理論上、ソケットが常にsend() ingのために利用可能であることを意味しますか?select()ing writeの概念fd_set

最後の質問として、セッション全体の書き込み操作用に接続ソケットを接続することは現実的ですか?

ありがとうございました。

答えて

3

書き込みに使用できないソケットの最も一般的なケースは、接続が比較的遅いネットワークリンクを経由してアプリケーションが飽和する場合です。オペレーティングシステムは限られた量のデータをバッファします。したがって、ソケットを使用できるかどうか(いくつかのデータが送信され、バッファに空き領域があることを示す)を確認してアプリケーションを抑制しなければなりません。

あなたの他の質問としては、例えば1つのスレッドで使用されている種類のソケットが複数ある場合は、 Webサーバでは、効率的にそれらを管理するためにselect()を使うのは確かに理にかなっています。

1

ノンブロッキングソケットを使用する場合、WSAEWOULDBLOCKエラーが発生すると、すべての操作が失敗する可能性があります。 connect()およびsend()の場合、select()を使用して、保留中のconnect()呼び出しがサーバーに正常に接続されたかどうか、またはソケットが書き込み可能である場合に、ブロックせずに新しいデータを受け入れることができます。

1

「送信可能」は、ソケットの送信バッファに空きがあることを意味します。これは、ほとんどの場合、接続が完了してバッファが割り当てられてから始まります。バッファがいっぱいになったときだけ真実であり、ターゲットソケットの受信バッファがいっぱいになったときにのみ発生し、読み込みアプリケーションがライターよりも遅い場合にのみ発生します。

+0

ターゲットソケットの受信バッファが満杯でない可能性があります。遅いネットワーク接続の場合もあります。 – mark4o