Многоадресная рассылка UDP с несколькими сетевыми картами работает, только когда активен один интерфейс - PullRequest
4 голосов
/ 08 августа 2011

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

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

Теперь, когда я использую два сетевых адаптера, я могу получить только TX из первого перечисленного и не могу получить ни один. WireShark не показывает какие-либо принятые пакеты на порту ни для одного из двух сетевых адаптеров, когда они оба активны.

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

public UDPInstance(IPAddress ip, int port, int RXFrequency)
{
    rxFreq = RXFrequency;
    // Listener Init
    TXclient = new UdpClient();
    RXclient = new UdpClient();
    TXclient.ExclusiveAddressUse = false;
    RXclient.ExclusiveAddressUse = false;
    //localEp = new IPEndPoint(ip, port);
    TXlocalEp = new IPEndPoint(ip, port);
    RXlocalEp = new IPEndPoint(IPAddress.Any, port);
    TXclient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    RXclient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);            

    TXclient.Client.Bind(TXlocalEp);
    RXclient.Client.Bind(RXlocalEp);
    InterfaceIP = ip.ToString();

    multicastaddress = IPAddress.Parse("239.0.0.222");
    TXclient.JoinMulticastGroup(multicastaddress);
    RXclient.JoinMulticastGroup(multicastaddress);
    // Sender Init
    remoteep = new IPEndPoint(multicastaddress, port);
    Listener = null;
    RXData = new List<string>();
    StartListenerThread();
}

public void StartListenerThread()
{
    Listener = new Thread(new ThreadStart(ListenerThread));
    Listener.IsBackground = true;
    Listener.Start();
}

public void StopListenerThread()
{
    Listener.Abort();
}

private void ListenerThread()
{
    while (true)
    {
        Byte[] data = RXclient.Receive(ref remoteep);
        string datastr = Encoding.Unicode.GetString(data);
        if (datastr != "")
        {
            string[] PacketStrings = datastr.Split(new char[] { '~' });
            foreach (string pkt in PacketStrings)
                RXData.Add(pkt);
        }
        Thread.Sleep(rxFreq);
    }
}

public void Transmit(string data)
{
    byte[] buffer;
    buffer = Encoding.Unicode.GetBytes(data);
    TXclient.Send(buffer, buffer.Length, remoteep);
}

Ответы [ 3 ]

1 голос
/ 30 октября 2012

Майк Дж правильный.Один из конструкторов для класса UDPClient принимает IPEndPoint в качестве аргумента.Если IPEndPoint настроен на IP-адрес локального интерфейса, то это интерфейс, который будет использовать UDPClient и базовый сокет, так что да, вы можете иметь два UDP-клиента, привязанных к одному и тому же порту на машине, пока они включены.отдельные локальные IP-интерфейсы (т. е. многодомные или несколько сетевых карт).

1 голос
/ 06 апреля 2015

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

На моей машине отправителя у меня 6 сетевых карт.Но только 1 должна быть в состоянии отправлять многоадресные сообщения, поэтому я использовал этот прием из http://sinclairmediatech.com/using-multicast-on-windows-with-multiple-nics/:

Небольшой прием, который я использую, чтобы убедиться, что я получаю многоадресную рассылку справаinterface.

  1. Откройте cmd от имени администратора (щелкните правой кнопкой мыши, запустите от имени администратора)
  2. Удалите многоадресные маршруты по умолчанию.> route delete 224.0.0.0 mask 240.0.0.0
  3. Добавьте нужный маршрут к сетевой карте.> добавление маршрута 224.0.0.0 маска 240.0.0.0 IP_of_NIC
0 голосов
/ 10 июля 2012

У меня была такая же проблема на отказоустойчивом кластере Windows ... Несколько сетевых устройств ...

Я закончил тем, что открыл дело с Micorsoft, так как думал, что это проблема ОС.

Не было.

Вам необходимо указать IP-адрес интерфейса, который вы хотите использовать для создания IPEndpoint.Затем используйте эту конечную точку при создании сокета вместо IPAddress.any

. Это решило проблему для меня.

Надеюсь, это поможет, даже если уже поздно.

...