Сбой многоадресного приема UDPClient на компьютере с несколькими сетевыми адаптерами

У меня есть компьютер с несколькими сетевыми картами, и метод отправки UDPClient постоянно дает сбой. Вот код:

        private static void receiveData()
    {
        recvSock = new UdpClient(PORT);
        //recvSock.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, mainInterface);
        recvSock.JoinMulticastGroup(IPAddress.Parse(IP), 50);

        IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);

        while (true)
        {
            byte[] data = recvSock.Receive(ref iep);

            // Do not include messages from us
            if (myIPs.Contains(iep.Address))
                continue;

            string stringData = Encoding.ASCII.GetString(data, 0, data.Length);
            Console.WriteLine("received: " + stringData);

        }
    }

ПОРТ = 5000 и IP = 224.5.6.7, так что все должно быть в порядке. Основная проблема в том, что я просто не могу пройти строку recvSock.Receive(). Я вижу пакеты, поступающие через wirehark, но код их просто не обрабатывает...

Мысли? Заранее спасибо!

Дэн

РЕДАКТИРОВАТЬ: я могу подтвердить, что проблема возникает из-за нескольких сетевых адаптеров --- код отлично работает с одним сетевым адаптером. Раскомментирование строки SetSocketOption должно позволить ей работать с несколькими сетевыми адаптерами, но все равно не получается... мысли?


person Dan    schedule 05.07.2010    source источник
comment
Чтобы было ясно, это клиентское приложение [компьютер] имеет несколько сетевых карт или сервер, к которому вы подключаетесь, имеет несколько сетевых карт??   -  person Robert Seder    schedule 06.07.2010
comment
Поскольку у меня та же проблема, я готов подтвердить: клиентское приложение [компьютер] имеет несколько сетевых карт. Обычно клиент заинтересован в том, чтобы серверы находились в любой из нескольких сетей NIC. Сервер с несколькими сетевыми адаптерами важен только в том случае, если клиент может видеть один и тот же сервер через несколько сетевых адаптеров на стороне клиента.   -  person Jesse Chisholm    schedule 20.07.2012
comment
@Dan Ты нашел обходной путь? у меня такая же проблема   -  person J4N    schedule 07.03.2013


Ответы (2)


У меня была такая же проблема, я нашел этот пост, а затем нашел решение по адресу: UDP: Read данные со всех сетевых интерфейсов

В основном Bind () для 0.0.0.0 не работает, и вам нужно использовать Bind () и JoinMulticastGroup () для каждого локального IP-адреса. Должен любить Microsoft за это.

person karl    schedule 24.10.2013

Интерфейсная часть является важной частью следующего кода:

unsigned long interface;
ip_mreq mreq;

_parseHostname( _description->getInterface(), interface );
mreq.imr_multiaddr.s_addr = _writeAddress.sin_addr.s_addr;
mreq.imr_interface.s_addr = interface;

setsockopt( _readFD, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                (char*)&mreq, sizeof( mreq ));

Интерфейсом является (одноадресный) IP-адрес принимающей сетевой карты.

person eile    schedule 06.07.2010
comment
Этот ответ может быть полезным. Но поскольку он использует терминологию из пакета сокетов, радикально отличающегося от исходного вопроса, ..., кто может сказать? - person Jesse Chisholm; 20.07.2012
comment
Единственное отношение этого ответа к данному вопросу состоит в том, что они оба содержат слово IP. - person BTownTKD; 29.01.2013