0

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

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

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

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

前もって感謝します。ラグ。

4

4 に答える 4

1

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

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

マルチキャストを使用すると、送信者の観点から多くの節約になります。n* sendの代わりに、1回の送信操作のみを実行する必要があります。

于 2009-10-24T00:26:17.523 に答える
1

マルチキャストは、LAN 経由で通信している場合にのみ使用できます。インターネット経由では機能しません。

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

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

于 2009-10-24T00:58:12.393 に答える
0

非常に高価なスイッチがない限り、各ホストに udp ユニキャストを実行することをお勧めします。はい、ブロードキャスト/マルチキャストは、実際には、PC よりもはるかに弱い CPU を備えたほとんどのスイッチで遅くなる可能性があります。単純な転送以外のことをすると、非常に遅くなります。

ベンチマークを実行して確認してください。

于 2009-10-25T00:22:50.760 に答える
0

非同期ソケット プログラミングは間違いなく最適な方法です。:)

于 2009-10-26T18:16:46.110 に答える