2

UDP を参照します。例に見られるように、クライアントごとに単一のポート(したがってバインドされたソケット)を持つことを提案する人もいます。Quake III は、着信ストリームのバッファリングに適しています。私はこれを買うかどうか完全に確信が持てません。

これらのバッファの内容が常に消費されるようにするのは、結局のところ自分のコードにかかっているのではないでしょうか? 私のサーバーでは、これを 1 秒間に約 20 ~ 30 回行う予定です。クライアントが同じ速度でパケットをプッシュしている場合、バッファリングがどのように問題になるかわかりません。FWIW、私のパケットの長さは最大 1024 バイトになります。クライアントは 4 人、多くても 8 人です。多くの情報源 (例:この回答) から、Windows のデフォルトのバッファ サイズが 8k であることを理解しています。したがって、4つのクライアントでは、これは通常問題ないはずです...ただし、バッファサイズを多少大きくする必要があると思いますが、これに落とし穴があるかどうかはわかりませんが、これが行われていることは認識しています経由setsockopt()

4

1 に答える 1

0

OS と言語でバッファリングを行うコードは、ポートに関係なく同じであるため、複数のソケットの複数のバッファに入るか、1 つのソケットの 1 つのバッファに入るかに違いはありません。1 つのポートの 1 つのソケットに、より大きな (N 倍) バッファーを設定することは、N ポートの N バッファーに相当します。

また、1 秒あたり 8 * 30 パケット (240 パケット/秒) について話している場合は、1980 年代の計算機でこれを実行していない限り、バッファリングのパフォーマンスについて心配する必要はありません。

送信レートが読み取りレートよりも高い場合、バッファーの大きさに関係なく、バッファーがいっぱいになり、パケットがドロップされます。バッファーのサイズは、レイテンシーを指定するだけです。

ただし、N 個のクライアントがあり、それらがすべて 20/秒の速度でパケットを送信している場合、サーバーは最低でも N*20/秒の速度でパケットを読み取る必要がありますが、実際にはそれよりも速く読み取る必要があります。特に負荷がかかっている場合は、マシンのタイミング (クロック) の変動になるため、サーバーはそれを確実に補正するために最小値を計算するよりも頻繁に読み取ろうとするか、1 秒あたり N 回バッファーを排出する必要があります。 (対応する正しいサイズのバッファーを指定する限り、好きな頻度で)。

さらに、パスに沿ったルーターからの 1 つまたは 2 つの他のパケットと一緒にバッチ処理される可能性のある遅延パケットを時折取得する可能性があるため、3 つのパケットを取得しないように、バッファー サイズを 8k (2x または 3x) よりわずかに大きく設定します。 1 つのクライアント (そのうちの 2 つは古く、読み取り時に破棄または上書きします) からまとめられたパケットが、他のクライアントからの新しいパケットを上書きします。

于 2011-12-29T04:40:35.113 に答える