非ブロッキングソケットで何かを送信するために、select()でシグナルを待つ必要がありますか?常に送信するものがあり、send()関数を呼び出すとどうなりますか?つまり、send()を呼び出すたびに、固定長で送信するデータが確実に存在します。送信がブロックされないという意味ですか?
2 に答える
への呼び出しはsend
、ノンブロッキング ソケットでは決してブロックされません。データを送信できなかった場合 (たとえば、送信バッファーがいっぱいの場合)、 はsend
すぐに の値を返しますSOCKET_ERROR
。
WSAEWOULDBLOCK
ブロックする呼び出しはすべて、 ( を呼び出すことによって )のエラー コードによって通知されますWSAGetLastError
。
への呼び出しにも同じことが当てはまりますreceive
。受信バッファにデータがない場合でも、呼び出しはすぐに戻り、エラーが発生します。
それはプロトコルに依存します。send()
通常のブロッキングでは、カーネル内ソケット バッファがいっぱいになる可能性があるため、TCP ソケットがブロックされる可能性があります。一方、UDP はパケットをスタックにプッシュするか、パケットが大きすぎる場合はブロックせずに破棄します。
編集 0:
わかりました、@Cicada のおかげで、ノンブロッキング ソケットについて話していることを見逃していたようです。
それは依然としてプロトコルに依存します - UDP を使用すると、パケットは送信されるか破棄されます。TCP を使用すると、データがあるときに送信しようとし、取得した場合はソケットを/でEWOULDBLOCK
登録し、ソケットが再び書き込み可能になったことをカーネルが通知したときに送信を再試行します。select()
poll()