2012-04-25 13 views
1

PCがスリープから復帰したときに、PCからカメラにUDPパケットを送信します。 PCが再開した後にネットワークインタフェースに時間が掛かり(未知)、生き残るために、私はパケットをループに入れてカメラに送り続けます。カメラがパケットを受信すると、カメラは確認信号をPCに送信します。 私の問題は「カメラからのUDPパケットを受信する(ack信号)、私はrecvfrm()関数を使用してループをブロックします。この関数をブロック解除して、カメラからの確認信号を受信したときだけループを終了させる方法recvfrom関数に渡される。linuxのrecv()またはrecvfrm()関数のブロックを解除する方法C

+0

MSG_DONTWAITはジョブを実行しますが、別の小さな問題があります。ネットワークが生き残る前に、パケットをループに入れてカメラに送ります。ネットワークが生存するとすぐに、パケットがカメラによって受信され、確認信号がPCに返送されます。問題は、PCが肯定応答信号を受信して​​ループを抜ける前に、まだいくつかのパケットをカメラに送信して、どこかにバッファされていることです。次回は、カメラがPCからのパケットを待つのではなく、受け入れられない古いパケットを読み込みます。どのように私はそのような状況を避けるのですか?古いパケットをフラッシュ/クリアするにはどうしたらいいですか? – user846400

答えて

2

A m maverikの答え(それ以外の場合は正しい)へのポータブルな解決策は、fcntlのソケットをO_NONBLOCKにすることです。

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

あなたがあいまいなフラグとfcntlを改ざんしたくない場合は別の方法として、あなたが送信するパケットを絞るためにゼロタイムアウト付き、あるいはゼロ以外のタイムアウトで(即応の記述子をselect可能性 - それはですおそらくネットワークスタックにあふれないようにするのがよい考えです)。何かを読むことができると言うまでselectまで送ってください。

+0

+1ポータビリティノート – maverik

3

使用MSG_DONTWAITフラグ。これは、非ブロッキングモードを可能にする。動作は、このコールがEAGAIN又はEWOULDBLOCKエラーコードを返しブロックする場合。

0

最も簡単な方法(ただし、素敵なコード)でありますしばらく待ってから、recvfrom()を呼び出す前にselectを使用してください。

関連する問題