6

Linux で C++ アプリケーションを作成しています。私のアプリケーションには、いくつかのイベントでクライアントにデータを送信する UDP サーバーがあります。UDP サーバーは、クライアントからのフィードバック/確認応答も受け取ります。

このアプリケーションを実装するために、単一の UDP ソケット (例: int fdSocket) を使用して、すべてのクライアントからデータを送受信しました。この靴下をポート 8080 にバインドし、ソケットを NON_BLOCKING モードに設定しました。

スレッドを 2 つ作成しました。あるスレッドでは、何らかのイベントが発生するのを待ちます。イベントが発生した場合は、fdsocket を使用してすべてのクライアントに (for ループで) データを送信します。

別のスレッドでは、 を使用しfdSocketてクライアントからデータを受信します ( recvfrom())。このスレッドは 4 秒ごとに実行されるようにスケジュールされています (つまり、4 秒ごとに呼び出しrecvfrom()てソケット バッファからデータを取得します。NON-BLOCKING モードであるため、recvfrom()利用可能な UDP データがない場合、関数はすぐに戻ります。 4 秒間スリープします)。

すべてのクライアントからの UDP フィードバック/確認応答には、サイズが 20 バイトの固定ペイロードがあります。

ここで、この実装に関連する 2 つの質問があります。

  1. 複数のクライアントとの UDP データの送受信に同じソケットを使用するのは正しいですか?
  2. アプリケーションが UDP ソケット バッファ オーバーフローなしで処理できる UDP フィードバック/確認応答パケットの最大数を見つける方法 (4 秒ごとに読み取りを行っているため、この 4 秒以内に大量のパケットを受信すると、一部のパケットが失われる可能性があります。安全に処理できるパケット/秒のレートを見つけるには?

fdsocket関数呼び出し を使用して、socket() の Linux ソケット バッファ サイズを取得しようとしましたgetsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);。この関数から、ソケット バッファのサイズが 110592 であることを発見しました。しかし、このソケット バッファに格納されるデータは明確ではありません。UDP ペイロードのみ、または UDP パケット全体、またはイーサネット パケット全体を格納しますか? アイデアを得るためにこのリンクを参照しましたが、混乱しました。

現在、私のコードは少し汚れています。すぐにきれいにしてここに投稿します。

以下は、この質問を投稿する前に参照したリンクです。

  1. Linux ネットワーキング
  2. UDP SentTo および Recvfrom の最大バッファ サイズ
  3. UDP ソケット バッファ オーバーフローの検出
  4. 同じソケットを介したUDPブロードキャストとユニキャスト?
  5. 複数のスレッドで同じ UDP ソケットから送信する
  6. CでUDPソケットの入力バッファをフラッシュするには?
  7. Linuxのソケットバッファサイズを見つける方法
  8. UDP ソケットのキューに入れられたデータの量を取得するにはどうすればよいですか?
4

3 に答える 3

6

4 秒の固定間隔でソケットを読み取ると、確実にパケットが失われます。ノンブロッキング I/O に対する従来の実証済みのアプローチは、デマルチプレクサ システム コールselect(2)/ poll(2)/epoll(7)です。これらを使用して、他のイベントをキャプチャ/反応できるかどうかを確認してください。

一方、すでにスレッドを使用しているため、4 秒間のスリープなしでrecv(2)をブロックするだけで済みます。

の説明についてはスティーブンスを読んでくださいSO_RCVBUF

于 2012-07-12T12:19:45.177 に答える
3

最大許容バッファ サイズを確認できます。

sysctl net.core.rmem_max

次の方法で、使用できる最大バッファ サイズを設定できます。

sysctl -w net.core.rmem_max=8388608

setsockopt を使用して SO_RCVBUF を変更することにより、実行時に (上記の最大値を超えないように) バッファー サイズを設定することもできます。/proc/net/udp を見ると、バッファ レベルを確認できます。

バッファーは UDP ヘッダーとアプリケーション データを格納するために使用され、残りは下位レベルに属します。

于 2012-07-12T12:21:29.150 に答える
3

Q: 複数のクライアントで UDP データの送受信に同じソケットを使用するのは正しいですか?

A: はい、正しいです。

Q: アプリケーションが UDP ソケット バッファ オーバーフローなしで処理できる UDP フィードバック/確認応答パケットの最大数を見つける方法 (4 秒ごとに読み取りを行っているため、この 4 秒以内に大量のパケットを受信すると、一部のパケットが失われる可能性があります。レートを見つける必要があります: noofpackets/sec 安全に処理できます)?

A: ボトルネックは、ネットワーク帯域幅、CPU、またはメモリである可能性があります。連続した番号で ACK をサーバーに送信するクライアントを使用して単純にテストを行い、サーバーでパケット損失があるかどうかを確認できます。

于 2012-07-12T12:17:25.173 に答える