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. シンプルなHTTPクライアントC用のrecv()ブロック
- 2. C++を使用してrecv()関数でビッグデータを受け取る方法は?
- 3. Linuxのユーザーのsudoのパスワードを解除する方法は?
- 4. Mono/C#プログラムでlinux/C++関数を呼び出す方法は?
- 5. ServerSocket.accept()でブロックされたスレッドのブロックを解除するには?
- 6. ブロックされたソケットのブロックを解除するには?
- 7. ソケットプログラミングC/C++ - recv関数がハングしますか?
- 8. selectを使用してブロックrecv()を処理する方法
- 9. C++ソケットプログラミング:AcceptとRecvメソッドはプロセスをブロックしません
- 10. 特定のUSBポートのブロックを解除する方法
- 11. 自動ブロックされたユーザーのブロックを解除する
- 12. Linux | C++のセグメンテーションフォルト - 関数ifstreamのため
- 13. recv winsock関数からバイナリデータを受け取る方法
- 14. linuxの条件変数のロック解除c
- 15. Python Linux Netlink Recvバッファー
- 16. JQuery BlockUI - ファイルをダウンロードした後にUIのブロックを解除する方法
- 17. "Recv失敗:接続がリセットされました"を解決する方法
- 18. emacs lispで関数を定義解除する方法はありますか?
- 19. C++別の関数からループを解除する
- 20. Linuxカーネルのstart_kernel関数の関数を時間測定する方法は?
- 21. IndexedDBのブロックを解除する
- 22. GetQueuedCompletionStatusからのブロックを解除する
- 23. LinuxのC言語でタイマーのコールバック関数を実装する方法
- 24. ブロックを解除ウィジェット
- 25. linuxのPythonコードからC++関数を呼び出す方法は?
- 26. SIGINTとSIGQUITのブロックとブロック解除
- 27. MSG_PEEKの非ブロックrecvが成功した場合、MSG_PEEKのない次のrecvも成功しますか?
- 28. Linuxのcの `getch`関数の使い方は?
- 29. while(true)を使用せずにrecv関数を使用する方法?
- 30. LinuxからのC++関数のエクスポート/インポートダイナミックライブラリ/ Linuxコンソールアプリケーション| Visual Studio Linux Project
MSG_DONTWAITはジョブを実行しますが、別の小さな問題があります。ネットワークが生き残る前に、パケットをループに入れてカメラに送ります。ネットワークが生存するとすぐに、パケットがカメラによって受信され、確認信号がPCに返送されます。問題は、PCが肯定応答信号を受信してループを抜ける前に、まだいくつかのパケットをカメラに送信して、どこかにバッファされていることです。次回は、カメラがPCからのパケットを待つのではなく、受け入れられない古いパケットを読み込みます。どのように私はそのような状況を避けるのですか?古いパケットをフラッシュ/クリアするにはどうしたらいいですか? – user846400