2016-03-21 3 views
1

私は現在select()タイムアウトでブロッキングソケットを使用するアプリケーションで作業していますが、Write関数ではsend()で非ブロッキングソケットを使用しています。私はちょうど(そしてすべての)状況がEWOULDBLOCK/EAGAINを返送することを知る必要がありますか? send()ためいつsend()がEWOULDBLOCKを返しますか?

+1

私はこの質問を理解しているかどうか、あるいはドキュメントを理解していない可能性があります。 'send()'は、ソケットが非ブロッキングモードで、何らかの理由で呼び出しがブロックされた場合、 'EAGAIN'または' EWOULDBLOCK'を返します。仕様にはこれ以上の詳細は含まれておらず、詳細は実装固有のものになります。いくつかの実装では、メッセージ全体を収容するのに十分な空き領域が送信バッファにないことを意味しますが、バッファリングの詳細は実装固有です。 –

+1

@JohnBollingerすべての実装について。送信バッファはドキュメントに記載されています。実装の詳細ではありません。 – EJP

答えて

2

、Linuxのmanページは言う:

ソケットが ノンブロッキングI/Oに配置されていない限り、メッセージは、 送信()は通常のブロック、ソケットの送信バッファに収まらない場合にはモード。ノンブロッキングモードでは、この場合はエラー EAGAINまたはEWOULDBLOCKで失敗します。 select(2)呼び出しを使用して、より多くのデータをいつ送信できるかを決定するために を使用することができます。

戻るEAGAINまたはEWOULDBLOCK値:ソケットがノンブロッキングにマークされ、 要求された操作はブロックされます。 POSIX.1-2001では、この場合には のエラーが返され、これらの定数は に同じ値を必要としないため、ポータブルアプリケーションは の可能性をチェックする必要があります。

関連する問題