0

非ブロッキングソケットで何かを送信するために、select()でシグナルを待つ必要がありますか?常に送信するものがあり、send()関数を呼び出すとどうなりますか?つまり、send()を呼び出すたびに、固定長で送信するデータが確実に存在します。送信がブロックされないという意味ですか?

4

2 に答える 2

3

への呼び出しはsend、ノンブロッキング ソケットでは決してブロックされません。データを送信できなかった場合 (たとえば、送信バッファーがいっぱいの場合)、 はsendすぐに の値を返しますSOCKET_ERROR

WSAEWOULDBLOCKブロックする呼び出しはすべて、 ( を呼び出すことによって )のエラー コードによって通知されますWSAGetLastError

への呼び出しにも同じことが当てはまりますreceive。受信バッファにデータがない場合でも、呼び出しはすぐに戻り、エラーが発生します。

于 2012-05-19T20:29:22.117 に答える
0

それはプロトコルに依存します。send()通常のブロッキングでは、カーネル内ソケット バッファがいっぱいになる可能性があるため、TCP ソケットがブロックされる可能性があります。一方、UDP はパケットをスタックにプッシュするか、パケットが大きすぎる場合はブロックせずに破棄します。

編集 0:

わかりました、@Cicada のおかげで、ノンブロッキング ソケットについて話していることを見逃していたようです。

それは依然としてプロトコルに依存します - UDP を使用すると、パケットは送信されるか破棄されます。TCP を使用すると、データがあるときに送信しようとし、取得した場合はソケットを/でEWOULDBLOCK登録し、ソケットが再び書き込み可能になったことをカーネルが通知したときに送信を再試行します。select()poll()

于 2012-05-19T20:41:35.167 に答える