C# socket отправляет // привязывает групповые рассылки udp не к выбранному сетевому интерфейсу

Здравствуйте, у меня есть 2 сетевых адаптера на моем ПК, и я хочу отправить многоадресные передачи udp в группу 239.0.0.222 Порт 9050 на выбранном сетевом интерфейсе. Но он работает только с первым интерфейсом, при выборе другого сетевого адаптера данные не отправляются.

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 показывает мне правильное объединение многоадресной группы на втором адаптере

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

EDIT3:
Я сейчас попробовал на другом ПК, но та же проблема возникает снова, Adapter1 работает, на всех остальных ничего не отправляется.
Еще одна вещь, которую я попробовал, это переключить порядок первых двух адаптеров в конфигурации Windows XP, затем снова работает первый первый адаптер, но новый второй ничего не посылает.

2 ответа

Решение

По умолчанию только первый адаптер присоединяется к данной многоадресной группе. С точки зрения ОС, это абсолютно актуально, поскольку группа будет предоставлять одинаковое содержимое независимо от того, какой адаптер использует многоадресный поток. Если вы планируете прослушивать многоадресную рассылку на каждом из ваших адаптеров, вы должны выполнить итерации по ним и установить соответствующую опцию сокета для каждого:

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

Я думаю, что у этого парня есть ответ, вы должны перебрать сетевые интерфейсы и найти тот, который поддерживает многоадресную рассылку.

http://windowsasusual.blogspot.ru/2013/01/socket-option-multicast-interface.html

Другие вопросы по тегам