1

UDP を使用してサーバー システムから複数の Windows XP PC で実行されているクライアント アプリケーションにデータをブロードキャストするアプリケーションがあります。これは LAN 上にあり、通常はギガビットです。これは数年間うまくいきました。

ここで、各クアッド コア PC で 2 つ (またはそれ以上) のクライアント アプリケーションを実行し、アプリケーションの各インスタンスがブロードキャスト データを受信する必要があります。これを実装するために私が使用した方法は、各クライアント PC に複数の IP アドレスを与えることです。次に、各クライアント アプリは、同じポート番号を使用してサーバーに接続しますが、IP は異なります。これは機能的には機能しますが、何らかの理由でパフォーマンスが非常に低下します。データ転送速度が約 10 分の 1 になりました。

複数の IP アドレスを取得するために、2 つの NIC アダプターを使用することと、TCP/IP ネットワークの詳細プロパティで複数の IP アドレスを 1 つの NIC に割り当てることの両方を試しました。どちらの方法も同様にパフォーマンスが低下しているようです。また、いくつかの異なるメーカーの NIC を使用してみましたが、どちらも役に立ちませんでした。

私が気づいたことの 1 つは、データがより断片化されているように見えることです。PC 上のクライアントが 1 つだけの場合、クライアントに 20k バイトのデータを送信すると、ほとんどの場合、すべてのデータが 1 つのチャンクで受信されます。しかし、2 つのクライアントが実行されていると、データはほとんどがフレームのサイズ (1500 バイト) のブロックに収まるように見えるため、私のコードはさらに何度も繰り返す必要があります。しかし、これだけでパフォーマンスに劇的な影響を与えるとは思いません。

だから私の質問は、なぜパフォーマンスが非常に遅いのか、そしてそれをスピードアップするために何かできることがあるのか​​知っている人はいますか?

サーバーが PC ごとに 1 つのクライアントにのみデータを送信し、そのクライアントが同じ PC 上の他のクライアントにデータをミラーリングできるように、再設計できることはわかっています。しかし、それは大規模な再設計と再コーディングの作業であるため、最後の手段として保持したいと思います。

4

1 に答える 1

1

クライアントごとに 1 つの IP アドレスを作成する代わりに、setsockopt() を使用して、ソケットごとに SO_REUSEADDR オプションを有効にしてみてください。これにより、すべてのクライアントが同じホスト アドレスの同じポートにバインドし、ブロードキャスト データを受信できるようになります。複数の NIC/IP アドレスのアプローチよりも管理が容易です。

SO_REUSEADDR は、ブロードキャスト ソケットとマルチキャスト ソケットが同じポートとアドレスを共有できるようにします。詳細については 、「Windows で のSO_REUSEADDR と UDP の動作」および「 SO_REUSEADDR の使用」を参照してください。

于 2011-11-10T01:36:20.080 に答える