3

私は UDP マルチキャスト ライブラリに取り組んでおり、リンク障害、NIC ケーブルの切断/再接続などを適切に処理する方法について質問を受けました。

私のテストでは、次の設定があります。

  • 2 つのサーバー sA および sB
  • sA は UDP マルチキャスト データを送信しており、sB はマルチキャスト データを受信して​​います。
  • サーバは、レイヤ 2 Cisco ギガビット スイッチを介して接続されています

例として、sB のマルチキャスト グループに参加すると、sA のマルチキャスト パケットからそのソケットでデータを受信し始めます。

ここで、マルチキャスト レシーバー sB がバインドされている NIC を無効化/プラグを抜くと、ソケット レベルのエラー (Socket.ReceiveAsync など) を受信しません。マルチキャスト受信者がバインドされている IP が使用できなくなると、何らかの通知/例外が発生します。

とにかく、その NIC を再度有効にすると、送信者がまだ同じマルチキャスト グループで送信しているにもかかわらず、それ以上データを受信しません。ハードウェア リンク障害の後に、カーネルがマルチキャスト グループへの再参加を実際に処理することを期待していましたが、そうではないようです。ただし、ソケット レベルのエラーも発生していないため、マルチキャスト レシーバーのリンク障害を検出する方法がよくわかりません。カーネルがマルチキャスト グループに再参加するために設定する必要がある特定のソケット オプションはありますか? これまでに思いついた唯一のオプションは、System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged イベントをリッスンし、バインドする必要があるローカル IP が再び利用可能になったという通知を受け取ったときに再バインドを試みることです。他のマルチキャスト アプリケーションはそのシナリオをどのように処理していますか?

ありがとう、

トム

4

2 に答える 2

3

次のイベントにサブスクライブすることをお勧めします: System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

使用可能なネットワークがオフラインになった場合に対処するには、レシーバーを適切にリセットするようにイベント ハンドラーを設計します。次に、逆に、ネットワークがオンラインになっている場合は、レシーバーを再バインドします。

于 2009-11-09T22:05:16.647 に答える
0

私の会社のプロトコルがどのように機能するかは会社の秘密であるため、詳細を説明することはできませんが、サーバーとクライアントの間で定期的にハートビートでプログラムします。ソフトウェアは、最後のハートビートが到着した時間を内部的に計り、何らかのネットワーク/ハードウェア障害が発生したかどうかを推測できます。

NetworkAddressChanged のチェックなど、発生した障害を検出するために試行錯誤できるオプションはたくさんありますが、ハート ビートを実装する方が安全です。これは、実装が簡単で、ほぼすべてのケースをカバーする一般的なソリューションだからです。

于 2009-09-29T07:30:46.420 に答える