2

PCがスリープ状態から再開したときに、PCからカメラにUDPパケットを送信したい。PCの再開後、ネットワークインターフェイスが有効になるまでに時間がかかる(不明)ため、ループでカメラにパケットを送信し続けます。カメラはパケットを受信すると、PCに確認信号を送信します。私の問題は、「カメラからUDPパケット(ack信号)を受信するために、ループをブロックするrecvfrm()関数を使用します。この関数のブロックを解除して、カメラから確認応答信号を受信したときにのみループを終了するようにするにはどうすればよいですか。

4

3 に答える 3

3

MSG_DONTWAIT関数に渡されたフラグを使用しrecvfromます。非ブロッキングモードを有効にします。操作がこの呼び出しをブロックする場合は、エラーコードが返されEAGAINますEWOULDBLOCK

于 2012-04-25T09:10:29.437 に答える
2

maverikの答え(それ以外の場合は正しい)に対するより移植性の高い解決策は、へfcntlのソケットO_NONBLOCKです。

MSG_DONTWAIT、LinuxとBSDで利用可能ですが、ほとんどのUnicesは、送信用にSUSv4でのみ標準化されています(なぜ、私にはわかりません...しかし、M。Kerriskはそう言っています)。これをサポートしていない注目すべきプラットフォームの1つは、Winsockです(少なくともMSDNには記載されていません)。

または、あいまいなフラグやを改ざんしたくない場合は、準備のための記述子を使用fcntlできますselect(タイムアウトがゼロの場合、またはタイムアウトがゼロ以外の場合でも、送信するパケットを抑制します。おそらく、そうしないことをお勧めします。ネットワークスタックをフラッドします)。select何かが読めると言われるまで送り続けてください。

于 2012-04-25T09:23:51.350 に答える
0

最も簡単な方法(ただし、最も優れたコードではありません)は、応答をしばらく待つことです。これは、 recvfrom()を呼び出す前にselectを使用することです。

于 2012-04-25T09:23:16.720 に答える