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 つの質問があります。
- 複数のクライアントとの UDP データの送受信に同じソケットを使用するのは正しいですか?
- アプリケーションが UDP ソケット バッファ オーバーフローなしで処理できる UDP フィードバック/確認応答パケットの最大数を見つける方法 (4 秒ごとに読み取りを行っているため、この 4 秒以内に大量のパケットを受信すると、一部のパケットが失われる可能性があります。安全に処理できるパケット/秒のレートを見つけるには?
fdsocket
関数呼び出し を使用して、socket() の Linux ソケット バッファ サイズを取得しようとしましたgetsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
。この関数から、ソケット バッファのサイズが 110592 であることを発見しました。しかし、このソケット バッファに格納されるデータは明確ではありません。UDP ペイロードのみ、または UDP パケット全体、またはイーサネット パケット全体を格納しますか? アイデアを得るためにこのリンクを参照しましたが、混乱しました。
現在、私のコードは少し汚れています。すぐにきれいにしてここに投稿します。
以下は、この質問を投稿する前に参照したリンクです。