2014-03-19 4 views
0

Я пытаюсь передать дейтаграмму UDP на адрес многоадресной рассылки в локальной сети. Это прекрасно работает на десятках машин, за исключением одной конкретной машины.
Эта конкретная машина может получать для приема дейтаграмм с адреса многоадресной рассылки, но не может отправлять сообщения.Устранение неполадок Проблемы многоадресной рассылки UDP

Это код, я использую:

using (UdpClient client = new UdpClient()) 
{ 
    client.Send(bytes, bytes.Length, remoteEP); 
    client.Client.Shutdown(SocketShutdown.Both); 
    client.Client.Close(); 
} 

где remoteEP является IP-адрес и порт многоадресной группы, и bytes ли действительные данные.

  • Исключено исключение, сообщение просто не доставляется.
  • Сообщение -, полученное в петле на той же машине от 127.0.0.1.
  • Это сообщение не показано в исходящем сообщении Wireshark.
  • Аппарат является единственным в сети под управлением Windows 8.
  • Брандмауэр Windows отключен.
  • Машина находится в той же подсети, что и прослушивающие аппараты.
  • На этом компьютере имеется только один активный сетевой интерфейс.
  • Я пробовал:
    • client.BroadcastEnabled = true;.
    • Присоединение к групповой группе на стороне клиента.
    • с использованием BeginSend вместо Send.

Любые идеи для отладки приветствуются.

ответ

0

По иронии судьбы, после поиска решения в течение всего дня, я нахожу его через 2 минуты после отправки вопроса SO.

Способ, описанный в статье this. Я предполагаю, что есть сетевые интерфейсы, о которых я не знал.

Это пересмотренный код:

using (UdpClient client = new UdpClient()) 
{ 
    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 
    foreach (NetworkInterface adapter in nics) 
    { 
     IPInterfaceProperties ip_properties = adapter.GetIPProperties(); 
     if (adapter.GetIPProperties().MulticastAddresses.Count == 0) 
      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 
     client.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, (int)IPAddress.HostToNetworkOrder(p.Index)); 
     break; 
    } 

    client.Send(bytes, bytes.Length, remoteEP); 
    client.Client.Shutdown(SocketShutdown.Both); 
    client.Client.Close(); 
}