私は、単一のネットワーク内で完全に実行される .net ソリューションに取り組んでいます。ユーザーがシステムに変更を加えた場合は、アナウンスを開始し、他のユーザーにそれを聞いてそれに応じて行動してもらいたいと考えています。(TCP のように) 保証された配信を維持しながら、このような (UDP でできるように) メッセージをブロードキャストする方法はありますか?
それが違いを生むなら、これは小さなネットワーク(30程度のクライアント)上にあります。
私は、単一のネットワーク内で完全に実行される .net ソリューションに取り組んでいます。ユーザーがシステムに変更を加えた場合は、アナウンスを開始し、他のユーザーにそれを聞いてそれに応じて行動してもらいたいと考えています。(TCP のように) 保証された配信を維持しながら、このような (UDP でできるように) メッセージをブロードキャストする方法はありますか?
それが違いを生むなら、これは小さなネットワーク(30程度のクライアント)上にあります。
ほぼすべてのゲームで、UDP の高速反応特性 (およびそれほどではないがコネクションレス特性) と TCP の信頼性が必要です。彼らがしていることは、UDP の上に独自の信頼できるプロトコルを構築することです。これにより、パケットをどこにでもバーストするだけでなく、オプションで信頼性を高めることもできます.
信頼性の高いパケット システムは、通常、TCP より単純な単純な確認応答まで再試行するシステムですが、TCP が提供できるものをはるかに超えるプロトコルがあります。
あなたの状況は非常に単純に聞こえます。あなたはおそらく自分で最もクリーンな解決策を作ることができるでしょう - すべてのクライアントに「私はあなたに聞いた」という応答を送り返し、サーバーがそれを取得する (またはあきらめる) まで試行し続けるようにするだけです。
さらに何かが必要な場合は、ほとんどのカスタム プロトコル ライブラリが C++ で作成されているため、それらがどれだけ役立つかはわかりません。ただし、ここでの私の知識は数年前のものです。おそらく、いくつかのプロトコルが移植されています。うーん... RakNet と enet は、頭に浮かぶ 2 つの C/C++ ライブラリです。
Spreadを使用してグループ通信を行うことができます。
@epatel-私はSCTPの提案を2番目にしています(私は投票しましたが、まだコメントできませんので、ここに追加のものがあります)。
SCTP has many great features and flexibility. You can sub-divide your connection into multiple streams, and choose the reliablity of each and whether it is ordered or not. Alternatively, with the Partially Reliability extension, you can control reliability on a per message basis.
RFC3208「PGM信頼性の高いトランスポートプロトコル仕様」を調べることをお勧めします。
要約は次のとおりです。
Pragmatic General Multicast(PGM)は、複数のソースから 複数の受信者への
順序付きまたは順序なしの重複のないマルチキャストデータ配信を必要とするアプリケーション向けの信頼性の高いマルチキャストトランスポートプロトコルです。PGMは、グループ内の受信者が送信および修復からすべてのデータパケットを受信するか、回復不能なデータパケット損失を検出できることを保証します。PGMは、基本的な信頼性要件を備えたマルチキャストアプリケーションの実行可能なソリューションとして特に意図されています。その中心的な設計目標は、スケーラビリティとネットワーク効率を十分に考慮した操作の簡素化です。
放送はあなたが望むものではありません。あなたのメッセージを気にしないこのネットワークに接続されたデバイスが存在する可能性があり、おそらく存在する可能性があるため、マルチキャストを使用する必要があります。ネットワーク上のすべてのクライアントに送信して処理する必要があるブロードキャスト メッセージとは異なり、マルチキャスト メッセージは、関心のあるクライアント (つまり、この特定の種類のメッセージを受信し、それに基づいて行動する意図があるクライアント) にのみ配信されます。
後でこのシステムをスケールアップして、大規模なネットワークを介してルーティングする必要がある場合、マルチキャストはそれに合わせて拡張できますが、ブロードキャストはそうではないため、後で理解できるスケーラビリティの利点が得られます。一方、これらの「何かが変更されました」メッセージを表示する必要のないスイッチやその他のデバイスの不要なオーバーヘッドを排除します。
ActiveMQなどの Message Broker を使用できます。
メッセージをトピックにパブリッシュし、クライアントが永続的なサブスクリプションをトピックに登録するようにして、オンラインでなくてもメッセージを見逃さないようにします。
Apache ActiveMQ は、完全な JMS クライアントと共に Java で書かれたメッセージ ブローカーです。ただし、Apache ActiveMQ は、Stomp や OpenWire などの多数のプロトコルを介して通信するように設計されており、多数の異なる言語固有のクライアントをサポートしています。
クライアント プラットフォームのサポートには、c# と .net が含まれます
TCP サーバーを作成します。各クライアントを接続します。クライアントとの TCP プロトコルで、次のメッセージの合計サイズの 2 バイトのプレフィックスを持つ各パケットを作成します。
read(max_size=2)
次に、クライアントはソケットを呼び出して次のメッセージのサイズを決定しread(max_size=s)
、メッセージを収集します。
信頼性の高い、順序付けられたメッセージを簡単に取得できます。これにはメッセージング フレームワークは必要ありません。
アプリケーション層で独自の TCP のような動作を実装できます。
たとえば、UDP ブロードキャストを送信しますが、各ホストからの応答を期待します。X 秒以内に応答が得られなかった場合は、何らかのしきい値に達するまで別の応答を送信します。しきい値に達した場合 (つまり、ホストがまったく応答しなかった場合)、エラーを報告します。
ただし、これを行うには、応答を期待するホストの定義済みリストが必要です。
ライブラリを使用できるのに、なぜゼロから何かを構築するのですか?特にそのような小さなプロジェクトのために?
信頼性の高いマルチキャストメッセージングを使用しているEmcaster (PGM)を使用してみてください。これは、.NETで完全なソースで記述されています。トピックフィルタリングがすぐに利用できる素敵なpub/subエンジンを手に入れることができます。または、コードからそれを行う方法を学び、それに基づいて独自の拡張機能を作成することもできます。
できることは、ブロードキャスト後にクライアントに tcp 接続を開始させることです。それ以外の場合は、すべてのクライアントのリストを保持し、各クライアントへの接続を自分で開始する必要があります。
大まかに言えば、3つのオプションがあると思います。
Yoy は、Norm (NACK-Oriented Reliable Multicast) 仕様を確認する必要があります。Norm に関する情報は、こちらでご覧いただけます。
NORM プロトコルは、汎用 IP マルチキャスト ルーティングおよび転送サービスを介して、バルク データ オブジェクトまたはストリームのエンドツーエンドの信頼性の高い転送を提供するように設計されています。NORM は、トランスポートの信頼性のために選択的否定応答 (NACK) メカニズムを使用し、追加のプロトコル メカニズムを提供して、送信者と受信者の間で制限された「事前の」調整で信頼性の高いマルチキャスト セッションを実行します。
軍事の世界ではかなり有名です。
これらのシナリオで TCP の最も苛立たしい機能は、着信パケットを元の順序 (ストリームの概念) に並べ替える機能/方法だと思います。到着する前のバイトまでバイトを読み取ることはできません。
それなしで生きていけるなら、高速で信頼性の高いプロトコルを持つチャンスがありますが、パケットの順序付けはできません! 失われたパケットの別のコピーを受け取るまでバイトを注文できないため、両方を管理することはまったく不可能です。これが主なトレードオフです。
RDP マルチキャストを実行します。