PCがスリープ状態から再開したときに、PCからカメラにUDPパケットを送信したい。PCの再開後、ネットワークインターフェイスが有効になるまでに時間がかかる(不明)ため、ループでカメラにパケットを送信し続けます。カメラはパケットを受信すると、PCに確認信号を送信します。私の問題は、「カメラからUDPパケット(ack信号)を受信するために、ループをブロックするrecvfrm()関数を使用します。この関数のブロックを解除して、カメラから確認応答信号を受信したときにのみループを終了するようにするにはどうすればよいですか。
3 に答える
MSG_DONTWAIT
関数に渡されたフラグを使用しrecvfrom
ます。非ブロッキングモードを有効にします。操作がこの呼び出しをブロックする場合は、エラーコードが返されEAGAIN
ますEWOULDBLOCK
。
maverikの答え(それ以外の場合は正しい)に対するより移植性の高い解決策は、へfcntl
のソケットO_NONBLOCK
です。
MSG_DONTWAIT
、LinuxとBSDで利用可能ですが、ほとんどのUnicesは、送信用にSUSv4でのみ標準化されています(なぜ、私にはわかりません...しかし、M。Kerriskはそう言っています)。これをサポートしていない注目すべきプラットフォームの1つは、Winsockです(少なくともMSDNには記載されていません)。
または、あいまいなフラグやを改ざんしたくない場合は、準備のための記述子を使用fcntl
できますselect
(タイムアウトがゼロの場合、またはタイムアウトがゼロ以外の場合でも、送信するパケットを抑制します。おそらく、そうしないことをお勧めします。ネットワークスタックをフラッドします)。select
何かが読めると言われるまで送り続けてください。
最も簡単な方法(ただし、最も優れたコードではありません)は、応答をしばらく待つことです。これは、 recvfrom()を呼び出す前にselectを使用することです。