5 Stimmen

UDPClient Multicast-Empfang schlägt auf Computer mit mehreren NICs fehl

Ich habe einen Computer mit mehreren NICs - und die Sendemethode von UDPClient schlägt ständig fehl. Hier ist der Code:

        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 und IP = 224.5.6.7, das sollte also OK sein. Das Hauptproblem ist, dass ich einfach nicht über die Zeile recvSock.Receive() hinauskomme. Ich sehe die Pakete, die über Wireshark kommen - aber der Code will sie einfach nicht verarbeiten...

Was denken Sie? Vielen Dank im Voraus!

Dan

EDIT: Ich kann bestätigen, dass die mehreren NICs das Problem verursachen --- der Code funktioniert gut mit einer einzigen NIC. Uncommenting die SetSocketOption Zeile sollte es ermöglichen, mit mehreren NICs zu arbeiten, aber es immer noch nicht.... Gedanken?

1voto

karl Punkte 175

Ich hatte das gleiche Problem, fand diesen Beitrag und fand dann die Lösung unter: UDP: Daten von allen Netzwerkschnittstellen lesen

Grundsätzlich funktioniert Bind() an 0.0.0.0 nicht und Sie müssen Bind() und JoinMulticastGroup() an jeder lokalen IP-Adresse durchführen. Dafür muss man Microsoft einfach lieben.

0voto

eile Punkte 1123

Der Schnittstellenteil ist der wichtige Teil des folgenden Codes:

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

Dabei ist die Schnittstelle die (Unicast-)IP-Adresse der empfangenden Netzwerkkarte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X