質問

すべてのクライアントがstd :: map構造に格納されたc ++ノンブロッキングサーバーソケットを取得しました。

各clientObjectに対してsend()メソッドを呼び出して、接続されたクライアントに何かを送信することができますが、これはすでにかなりうまく機能しています。

しかし、すべてにメッセージを送信するため(ブロードキャスト?)知りたい: すべてのクライアントでfor / loopを実行し、各反復でClientObject-> send(" foo")を呼び出すよりも良い方法がありますか?

または、マルチキャストソケットを覗いてみるべきですか?

事前に感謝します。 ラグ。

役に立ちましたか?

解決

マルチキャストは、LANを介して通信している場合の唯一のオプションです。インターネットでは機能しません。

ここで行うことは、非同期I / Oを使用してソケットを逆多重化することです。これにより、データを複数のソケットに同時に送信し、非同期イベントハンドラーを使用して各送信を処理できます。

これを行うためのポータブルな方法として、Boost ASIOを検討することをお勧めします。 OS固有のシステムコール(UNIXのpoll / selectやLinuxのepollなど)を使用してこれを行うこともできますが、これははるかに複雑です。

他のヒント

ローカルノードについて、つまり「ブロードキャスト/マルチキャスト」内で話している限り、マルチキャストがはるかに望ましいでしょう。 LAN上のドメイン。

もちろん、そのようなメッセージをより広く分散させるためのマルチキャスト配信プロトコルがありますが、それらはめったに使用されず、特定のケースによっては、そのような機能に依存する信頼性がある/できない場合があります。

マルチキャストの使用は、送信者の観点から多くの節約に変換されます。n* sendの代わりに1つの送信操作のみが必要です。

これらの非常に高価なスイッチがない限り、各ホストに対してudpユニキャストを実行する方が良いでしょう。はい、ブロードキャスト/マルチキャストは、実際にはPCよりも多くのwimpier CPUを備えたほとんどのスイッチで遅くなる可能性があります。単純な転送以外の操作を行うと、速度が大幅に低下します。

ベンチマークを実行して確認します。

非同期ソケットプログラミングは間違いなく進むべき方法です! :)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top