0

ネットワークを介してサービスの複数のインスタンス間で通信するためのマルチキャストメッセージを送信するサービスを作成しています。2つのリスナーを設定し、メッセージを2回送信しています(プライマリNICでは239.1.1.1、セカンダリNICでは239.1.1.2)すべて正常に機能しますが、.2マルチキャストグループのセカンダリリスナーが送信されたメッセージを取得する場合があります。 .1マルチキャストグループ。なぜこれが起こっているのか考えていますか?

リスナーの設定方法は次のとおりです。

PrimaryLocalEP = new IPEndPoint(primaryNIC.Address, vnc.DefaultUtilityPort);
PrimaryClient.ExclusiveAddressUse = false;
PrimaryClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
PrimaryClient.Client.Bind(PrimaryLocalEP);
PrimaryClient.JoinMulticastGroup(IPAddress.Parse("239.1.1.1"), primaryNIC.Address);
PrimaryClient.MulticastLoopback = false;
PrimaryRemoteEP = new IPEndPoint(IPAddress.Parse("239.1.1.1"), vnc.DefaultUtilityPort);

ReadThread = new System.Threading.Thread(ReadConnection);
ReadThread.IsBackground = true;
ReadThread.Name = "UDPReadConnection";
ReadThread.Start();


SecondaryLocalEP = new IPEndPoint(secondaryNIC.Address, vnc.DefaultUtilityPort);
SecondaryClient.ExclusiveAddressUse = false;
SecondaryClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
SecondaryClient.Client.Bind(SecondaryLocalEP);
SecondaryClient.JoinMulticastGroup(IPAddress.Parse("239.1.1.2"), secondaryNIC.Address);
SecondaryClient.MulticastLoopback = false;
SecondaryRemoteEP = new IPEndPoint(IPAddress.Parse("239.1.1.2"), vnc.DefaultUtilityPort);

ReadThreadSecondary = new System.Threading.Thread(ReadSecondaryConnection);
ReadThreadSecondary.IsBackground = true;
ReadThreadSecondary.Name = "UDPReadConnectionSecondary";
ReadThreadSecondary.Start();
4

2 に答える 2

1

簡単な答え - それらを異なるポートに配置します。

基本的に何が起こるかというと、パケットを配信する必要があることを NIC ハードウェアが識別した後、つまり、特定のマルチキャスト グループのメンバーシップを持つプロセスがボックスに存在する場合、OS ネットワーク スタックはポート番号のみを使用して、UDP 入力を待機しているプロセスを識別します。2 つのリッスン プロセスのどちらがパケットを取得するかは、基本的にランダムです。

于 2012-07-18T14:52:00.593 に答える
0

これは、デフォルトでは 1 つの NIC のみがマルチキャスト リスナーであるという事実が原因で発生します (インターフェイスの優先度に応じた内部アルゴリズムにより OS によって選択されるため、確立された VPN 接続が問題を引き起こす可能性があります)。SocketOptionName.MulticastInterface特定の NIC が常にマルチキャスト リッスンに関与するように明示的に設定する必要があります。

于 2013-02-09T19:34:50.673 に答える