UDPClient Multicast получает сбой на компьютере с несколькими сетевыми картами - PullRequest
5 голосов
/ 06 июля 2010

У меня есть компьютер с несколькими сетевыми картами - и метод отправки 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);

        }
    }

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

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

Dan

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

Ответы [ 2 ]

1 голос
/ 24 октября 2013

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

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

0 голосов
/ 06 июля 2010

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

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-адресом принимающей сетевой карты.

...