2009-04-20 2 views
9

Я пытаюсь получить простую связь UDP, работающую в моей локальной сети.Как сделать многоадресную рассылку UDP через локальную сеть в C#?

Все, что я хочу сделать, это сделать многоадресной рассылки для всех машин в сети

Вот мой представляемого код

public void SendMessage(string message) 
    { 
     var data = Encoding.Default.GetBytes(message); 
     using (var udpClient = new UdpClient(AddressFamily.InterNetwork)) 
     { 
      var address = IPAddress.Parse("224.100.0.1"); 
      var ipEndPoint = new IPEndPoint(address, 8088); 
      udpClient.JoinMulticastGroup(address); 
      udpClient.Send(data, data.Length, ipEndPoint); 
      udpClient.Close(); 
     } 
    } 

и вот мой приемный код

public void Start() 
    { 
     udpClient = new UdpClient(8088); 
     udpClient.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50); 

     receiveThread = new Thread(Receive); 
     receiveThread.Start(); 
    } 

    public void Receive() 
    { 
     while (true) 
     { 
      var ipEndPoint = new IPEndPoint(IPAddress.Any, 0); 
      var data = udpClient.Receive(ref ipEndPoint); 

      Message = Encoding.Default.GetString(data); 

      // Raise the AfterReceive event 
      if (AfterReceive != null) 
      { 
       AfterReceive(this, new EventArgs()); 
      } 
     } 
    } 

Он работает отлично на моей локальной машине, но не по сети.

-Не кажется, что это брандмауэр. Я отключил его на обеих машинах, и он все еще не работает.

-It работает, если я делаю прямую отправку на жестко закодированный IP-адрес клиентской машины (т. Е. Не многоадресной рассылки).

Любая помощь будет оценена по достоинству.

ответ

7

Поддерживает ли ваше локальное сетевое оборудование IGMP?

Возможно, ваш коммутатор известен многоадресной рассылке, но если IGMP отключен, он не заметит, будет ли какое-либо подключенное оборудование подписаться на определенную группу многоадресной передачи, чтобы оно не пересылало эти пакеты.

Чтобы проверить это, временно подключите две машины непосредственно вместе с перекрестным кабелем. Это должно (AFAICR) всегда работать.

Кроме того, это должен быть сервер половина кода, который имеет аргумент TTL, предоставленный JoinMulticastGroup(), а не клиентскую половину.

0

Я не могу видеть TTL, указанный в любом месте кода. Помните, что TTL изначально предназначался для единиц в секундах, но стал единицей хмеля. Это означает, что с помощью умного TTL вы можете исключить прохождение через маршрутизатор. По умолчанию TTL на моей машине 32 - я думаю, что это должно быть более чем достаточно; но ваш может быть другим (UdpClient.Ttl), если ваша система прошла через любую блокировку безопасности.

Я не могу рекомендовать вам TTL, поскольку мне лично нужно много экспериментировать.

Если это не работает, вы можете взглянуть на эти статьи:

Все-в-все это выглядит, как там было с успехом используя Sockets, а не UdpClients.

Ваша выбранная группа многоадресной рассылки также может быть локальной. Try another one.

Ваш физический сетевой уровень также может вызывать проблемы. Я бы рискнул подвергнуть сомнению переключатели и прямые (x-over) соединения. Концентраторы и все более умные должны обрабатывать их отлично. Однако у меня нет литературы, чтобы поддержать это.

1

Я только что провел 4 часа на что-то подобное (я думаю), решение для меня было:

client.Client.Bind(new IPEndPoint(IPAddress.Any, SSDP_PORT)); 
client.JoinMulticastGroup(SSDP_IP,IP.ExternalIPAddresses.First()); 
client.MulticastLoopback = true; 

Используя специфический (первый внешний) IP-адрес на группе многоадресной рассылки.

+0

У меня возникли проблемы с подключением к локальной сети. Без второго аргумента явного IP-адреса для прослушивания при вызове JoinMulticastGroup() это просто произвольный выбор виртуального драйвера ethernet, который я установил как часть Docker/Hyper-V, и присоединение к нему в группу многоадресной рассылки вместо моей реальной сети адаптер. Если у вас несколько сетевых адаптеров, вы должны указать IP-адрес для присоединения к многоадресной группе явно с перегрузкой метода, которая принимает IP-адрес в качестве второго аргумента. – MEverett

Смежные вопросы