Как сделать UDP-рассылку по локальной сети в C #? - PullRequest
9 голосов
/ 20 апреля 2009

Я пытаюсь установить простую связь UDP, работающую в моей локальной сети.

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

Вот мой код отправки

    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());
            }
        }
    }

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

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

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

Буду признателен за любую помощь.

Ответы [ 3 ]

7 голосов
/ 20 апреля 2009

Аппаратное обеспечение вашей локальной сети поддерживает IGMP ?

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

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

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

2 голосов
/ 31 мая 2013

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

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

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

0 голосов
/ 20 апреля 2009

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

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

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

В целом, похоже, что был достигнут успех с использованием Sockets, а не UdpClients.

Выбранная группа многоадресной рассылки также может быть только локальной. Попробуйте другой.

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

...