web-dev-qa-db-ja.com

非ブロックソケットとブロックソケット-UDP-C&Linux

UDPで非ブロッキングソケットよりもブロッキングソケットを使用する場合

質問1:次のシナリオに推奨されるものは何ですか?

複数のクライアントが複数のUDPソケットを介してデータを送信します。つまり、client1がソケット100、101、102、..、105を介してデータを送信します。ソケット110、111、112 ... 115などのclient2。クライアントのポート番号は固定されています。クライアントの数は固定されています(10)。つまり、合計10 * 5ソケットです。

各ソケット(少なくとも3ソケット)のデータは、数ミリ秒ごとに送信されます。他の2つのソケットは、コマンドの送信とデータの取得用です。

データを受け取った後、いくつかのIOがディスクに書き込む場所に関係しています(上記のいずれも変更できません。つまり、ソケットの数など)。

質問2:このシナリオではスレッドを使用するのが最適ですか(または)非同期IOノンブロッキングソケットとの多重化ですか?

4
m4n07

通常の方法は、ブロッキングソケットで poll() または select() を使用することです。それらは任意のファイル記述子を受け入れるため、ソケットペアとのスレッド間またはプロセス間通信、またはstdinからの入力の読み取りに同じループを使用できます。

良い、かなり短く、要点は、 Beej's Guide to Network Programming Using Internet Sockets です。 select() に関する簡単なサンプルプログラム source のセクションをご覧ください。これはTCPを使用し、UDPを使用しないため、いくつかの調整を行う必要がありますが、UDPはおそらく単純化されます(ユースケースが再実装されていない限りTCP UDPに加えた機能。これはほとんど決して良い考えではありません)。

これがどれだけ重いかに応じて、個別のスレッド(または要件によってはプロセス)で処理するか、または同じループ内で処理することもできます: "データを受信した後、いくつかのIOディスクに書き込む場所に関係します。 "シングルスレッドの実装から始めて、より複雑にする前に、それがどのようになるかを確認します。

4
hyde