PCがスリープから復帰したときに、PCからカメラにUDPパケットを送信します。 PCが再開した後にネットワークインタフェースに時間が掛かり(未知)、生き残るために、私はパケットをループに入れてカメラに送り続けます。カメラがパケットを受信すると、カメラは確認信号をPCに送信します。 私の問題は「カメラからのUDPパケットを受信する(ack信号)、私はrecvfrm()関数を使用してループをブロックします。この関数をブロック解除して、カメラからの確認信号を受信したときだけループを終了させる方法recvfrom
関数に渡される。linuxのrecv()またはrecvfrm()関数のブロックを解除する方法C
答えて
A m maverikの答え(それ以外の場合は正しい)へのポータブルな解決策は、fcntl
のソケットをO_NONBLOCK
にすることです。
MSG_DONTWAIT
LinuxおよびBSDで利用できますが、ほとんどのUnicesはSUSv4で送信用に標準化されています(なぜ、私は知らないでしょう...しかしM. Kerriskはそう言います)。それをサポートしていない注目すべきプラットフォームの1つがWinsockです(少なくともMSDNには記載されていません)。
あなたがあいまいなフラグとfcntl
を改ざんしたくない場合は別の方法として、あなたが送信するパケットを絞るためにゼロタイムアウト付き、あるいはゼロ以外のタイムアウトで(即応の記述子をselect
可能性 - それはですおそらくネットワークスタックにあふれないようにするのがよい考えです)。何かを読むことができると言うまでselect
まで送ってください。
+1ポータビリティノート – maverik
使用MSG_DONTWAIT
フラグ。これは、非ブロッキングモードを可能にする。動作は、このコールがEAGAIN
又はEWOULDBLOCK
エラーコードを返しブロックする場合。
最も簡単な方法(ただし、素敵なコード)でありますしばらく待ってから、recvfrom()を呼び出す前にselectを使用してください。
- 1. C++を使用してrecv()関数でビッグデータを受け取る方法は?
- 2. シンプルなHTTPクライアントC用のrecv()ブロック
- 3. ServerSocket.accept()でブロックされたスレッドのブロックを解除するには?
- 4. ブロックされたソケットのブロックを解除するには?
- 5. ソケットプログラミングC/C++ - recv関数がハングしますか?
- 6. 特定のUSBポートのブロックを解除する方法
- 7. C++ソケットプログラミング:AcceptとRecvメソッドはプロセスをブロックしません
- 8. recv winsock関数からバイナリデータを受け取る方法
- 9. Linux | C++のセグメンテーションフォルト - 関数ifstreamのため
- 10. JQuery BlockUI - ファイルをダウンロードした後にUIのブロックを解除する方法
- 11. emacs lispで関数を定義解除する方法はありますか?
- 12. "Recv失敗:接続がリセットされました"を解決する方法
- 13. Python Linux Netlink Recvバッファー
- 14. LinuxのC言語でタイマーのコールバック関数を実装する方法
- 15. linuxのPythonコードからC++関数を呼び出す方法は?
- 16. PHPのリンク解除関数
- 17. MSG_PEEKの非ブロックrecvが成功した場合、MSG_PEEKのない次のrecvも成功しますか?
- 18. 反復ブロックのコードを関数に変換する方法
- 19. MS-DOS変数の定義を解除する方法は?
- 20. C++のグローバル関数でメンバ関数を指す方法は?
- 21. ブロックを解放する方法
- 22. eclipseでファイル関連のロックを解除する方法
- 23. C#でAutoResetEventまたはManualResetEventのブロック状態をチェックする方法は?
- 24. C#を使用してブロックされているウェブサイトのブロックを解除するには?
- 25. function_graphトレーサをftraceするためのLinuxカーネル関数の作成方法
- 26. C++の連続アングル(matlabのeラップ解除関数)
- 27. C#windowsアプリケーションでウィンドウロックを解除する方法は?
- 28. JQuery BlockUI notブロックを解除する
- 29. Cのテキストファイルから数値のブロックを読み取る方法
- 30. Objective Cの別のブロックに引数としてブロックを渡す方法
MSG_DONTWAITはジョブを実行しますが、別の小さな問題があります。ネットワークが生き残る前に、パケットをループに入れてカメラに送ります。ネットワークが生存するとすぐに、パケットがカメラによって受信され、確認信号がPCに返送されます。問題は、PCが肯定応答信号を受信してループを抜ける前に、まだいくつかのパケットをカメラに送信して、どこかにバッファされていることです。次回は、カメラがPCからのパケットを待つのではなく、受け入れられない古いパケットを読み込みます。どのように私はそのような状況を避けるのですか?古いパケットをフラッシュ/クリアするにはどうしたらいいですか? – user846400