0

こんにちは、PC に 2 つの Networkadapter があり、選択したネットワーク インターフェイスのグループ 239.0.0.222 ポート 9050 に udp マルチキャストを送信したいと考えています。ただし、最初のインターフェイスでのみ機能し、別の NIC を選択するとデータは送信されません。

localIP は、選択したアダプターのローカル IP です。

送信者コード:

 IPAddress localIP = getLocalIpAddress();
 IPAddress multicastaddress = IPAddress.Parse("239.0.0.222");
 IPEndPoint remoteep = new IPEndPoint(multicastaddress, 9050);
 UdpClient udpclient = new UdpClient(9050);
 MulticastOption mcastOpt = new MulticastOption(multicastaddress,localIP);

 udpclient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, mcastOpt);
 udpclient.Send(data, data.Length, remoteep);

EDIT1:
アダプターのローカル IP のコード:

NetworkInterface.GetAllNetworkInterfaces()[adapterIndex].GetIPProperties().UnicastAddresses[0].Address;

EDIT2,5:
また、同じ reuslt で両方を試してみると、Wireshark は 2 番目のアダプターでのマルチキャスト グループの正しい参加を表示します

udpclient.JoinMulticastGroup(multicastaddress);
udpclient.Client.Bind(remoteep);

EDIT3:
別のPCで試しましたが、同じ問題が再び発生し、Adapter1が実行され、他のすべてのPCでは何も送信されません。
私が試したもう1つのことは、Windows XP構成で最初の2つのアダプターの順序を切り替えることです。次に、新しい最初のアダプターは機能しますが、新しい2番目のアダプターは何も送信しません。

4

2 に答える 2

1

デフォルトでは、最初のアダプタのみが特定のマルチキャスト グループに参加します。OS の観点からは、マルチキャスト ストリームを消費するアダプターが何であれ、グループは同じコンテンツを提供するため、これは絶対に関連しています。各アダプターでマルチキャストをリッスンする予定の場合は、それらを繰り返し処理し、それぞれに適切なソケット オプションを配置する必要があります。

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in nics)
{
  IPInterfaceProperties ip_properties = adapter.GetIPProperties();
  if (!adapter.GetIPProperties().MulticastAddresses.Any())
    continue; // most of VPN adapters will be skipped
  if (!adapter.SupportsMulticast)
    continue; // multicast is meaningless for this type of connection
  if (OperationalStatus.Up != adapter.OperationalStatus)
    continue; // this adapter is off or not connected
  IPv4InterfaceProperties p = adapter.GetIPProperties().GetIPv4Properties();
  if (null == p)
    continue; // IPv4 is not configured on this adapter
  my_sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, (int)IPAddress.HostToNetworkOrder(p.Index));
}

PS はい、私は @lukebuehler が言及した「この男」です: http://windowsasusual.blogspot.ru/2013/01/socket-option-multicast-interface.html

于 2014-04-01T14:46:04.703 に答える