2012-01-15 8 views
8

ソケットがselect()への呼び出しによって書き込みがOKであるとシグナル通知された場合、どのくらいのデータをブロックせずに送信できるのか分かりますか?select()の使用時にsend()がブロックされることはありますか?

select()によって返されるセットにインクルードすると、ソケットが少なくとも1バイトのデータの準備ができていることを示し、send()は短いバイト数を返しますか?

lenパラメータが使用可能なバッファ領域よりも大きい場合は、send()と呼ぶとブロックされますか?もしそうなら、どのように最大額を知ることができますか?

私はLinuxで通常のCソケットを使用しています。

+1

APIがサポートしている場合は、 'SO_SNDLOWAT'オプションを使用できます。こうすることで、書き込み可能にする必要がある最小バイト数を選択できます。 – cnicutar

答えて

5

sendコールは最初のコールでブロックするべきではなく、最初のコールで少なくとも1バイト送信する必要があります。ストリームプロトコルを使用していて、シグナルなどで中断されていないと仮定していると仮定します。実際には二つの方法は、あなたが送信できるデータ量を把握します

  1. コールselectsendのすべての呼び出しの後に、より多くのデータを送信できるかどうかを確認します。

  2. ソケットを非ブロックモードにし、EAGAINまたはEWOULDBLOCKエラーが発生するまでsendを呼び出します。

2番目のオプションが優先されます。 (3番目の選択肢は、別のスレッドでそれを行い、単にスレッドブロックを許可することです。これは良い解決策です)従来、スレッド実装は成熟していなかったため、高性能サーバー)

+0

+1は2番目のオプションでもありますが、これも非常に一般的な方法です。 –

+0

なぜ2が優先されますか?私は説明や参考資料がこの回答を多く改善すると思います。また、両方を行うことはできませんか? –

4

あなたはわかりません。ソケットをノンブロッキングにするためには、ソケットを送信しなければなりません。そして、それが書き込まれた量を示す戻り値に注意を払う必要があります。