UDP: Daten von allen Netzwerkschnittstellen lesen

Ich habe den folgenden Code zum Lesen von Multicast-Nachrichten aus dem Netzwerk für eine bestimmte IP + -Port

private static void ReceiveMessages(int port, string ip, CancellationToken token)
{
    Task.Factory.StartNew(() =>
        {
            using (var mUdpClientReceiver = new UdpClient())
            {
                var mReceivingEndPoint = new IPEndPoint(IPAddress.Any, port);
                mUdpClientReceiver.ExclusiveAddressUse = false;
                mUdpClientReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                mUdpClientReceiver.ExclusiveAddressUse = false;
                mUdpClientReceiver.Client.Bind(mReceivingEndPoint);
                mUdpClientReceiver.JoinMulticastGroup(IPAddress.Parse(ip), 255);

                while (!token.IsCancellationRequested)
                {
                    byte[] receive = mUdpClientReceiver.Receive(ref mReceivingEndPoint);

                    Console.WriteLine("Message received from {0} ",mReceivingEndPoint);
                }
            }
        });
}

Ich habe zwei Netzwerkadapter, von denen ich Daten über diesen Multicast-IP + -Port erhalten habe (bestätigt durch zwei Instanzen der Wireshark-Überwachung für jeden Netzwerkadapter). Ich sehe auf Wireshark viel Verkehr auf diesen Ports (+ IP) für beide Netzwerkkarten.

Das Problem ist, dass auf meiner Konsole nur Nachrichten von einer Netzwerkkarte angezeigt werden.

Ich habe mit netstat nachgeprüft, dass keine andere Software auf meinem Port lauscht:

Warum erhalte ich also Datenverkehr nur von einer meiner beiden Netzwerkkarten?

BEARBEITEN:

Ich habe sogar folgendes ausprobiert:

private static void ReceiveMessages(int port, string ip, CancellationToken token, IEnumerable<IPAddress> ipAddresses)
{
    foreach (IPAddress ipAddress in ipAddresses)
    {
        IPAddress ipToUse = ipAddress;
        Task.Factory.StartNew(() =>
        {
            using (var mUdpClientReceiver = new UdpClient())
            {

                var mReceivingEndPoint = new IPEndPoint(ipToUse, port);
                mUdpClientReceiver.ExclusiveAddressUse = false;
                mUdpClientReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                mUdpClientReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
                mUdpClientReceiver.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontRoute, 1);
                mUdpClientReceiver.ExclusiveAddressUse = false;
                mUdpClientReceiver.Client.Bind(mReceivingEndPoint);
                mUdpClientReceiver.JoinMulticastGroup(IPAddress.Parse(ip), 255);
                Console.WriteLine("Starting to listen on "+ipToUse);
                while (!token.IsCancellationRequested)
                {
                    byte[] receive = mUdpClientReceiver.Receive(ref mReceivingEndPoint);

                    Console.WriteLine("Message received from {0} on {1}",  mReceivingEndPoint,ipToUse);
                }
            }
        });
    }
}

Ich sehe zweimal (für meine beiden IPs) "Abhören des korrekten IP", aber es werden immer noch nur Daten angezeigt, die von einer Netzwerkkarte stammen.

BEARBEITEN 2

Mir ist noch etwas Merkwürdiges aufgefallen. Wenn ich die Schnittstelle deaktiviere, auf der ich alle Daten erhalte, und dann die Software starte, erhalte ich jetzt Daten von der anderen Schnittstelle. Wenn ich die Schnittstelle wieder aktiviere und die Software neu starte, erhalte ich immer noch den Verkehr auf der nicht deaktivierten Karte.

Und ich weiß genau, dass ich Geräte habe, die auf mich reagieren, die nur mit einem Netzwerk verbunden sind (nicht mit beiden).

EDIT 3

Eine andere Sache: Wenn ich eine Nachricht von mir (localhost) auf allen Netzwerkkarten sende, die ich habe, sehe ich sie auf meinen beiden Netzwerkschnittstellen. ABER wenn ich mein Programm zweimal starte, erhält nur das erste Programm Nachrichten, nicht das zweite.

Bearbeiten 4

Zusätzliche Infos nach dem ersten Kommentar: Ich habe zwei Ethernet-Karten, eine mit dem10.10.24.78 ip, der andere mit dem10.9.10.234 ip. Nicht ich sende Daten, sondern Netzwerkkomponenten (der Port5353 Mit dieser IP-Adresse wird eine bekannte Multicast-Adresse für mDNS verwendet. Daher sollte ich Datenverkehr von Dingen wie Drucker, iTunes, Macs und einigen anderen von uns erstellten Software-Komponenten empfangen. Daten werden auf der IP multicasted224.0.0.251 und Hafen5353.

Hier ist ein Code, den Sie zum Senden von Daten auf mehreren IP-Adressen verwenden können. Wie ich bereits beschrieben habe, funktioniert der lokale Start jedoch fast (mit der Ausnahme, dass nur ein lokaler Client die Nachricht empfängt).

private static void SendManuallyOnAllCards(int port, string multicastAddress, IEnumerable<IPAddress> ipAddresses)
{
    foreach (IPAddress remoteAddress in ipAddresses)
    {
        IPAddress ipToUse = remoteAddress;
        using (var mSendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
        {
            mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
                                        new MulticastOption(IPAddress.Parse(multicastAddress)));
            mSendSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 255);
            mSendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

            var ipep = new IPEndPoint(ipToUse, port);
            //IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(multicastAddress), port);
            mSendSocket.Bind(ipep);
            mSendSocket.Connect(ipep);


            byte[] bytes = Encoding.ASCII.GetBytes("This is my welcome message");
            mSendSocket.Send(bytes, bytes.Length, SocketFlags.None);
        }
    }
}

BEARBEITEN 5 Hier ist das Ergebnis meinerroute print(Kannte diesen Befehl nicht), und auf meinen beiden IPs erhalte ich immer Daten auf dem10.9.10.234

Bearbeiten 6

Ich habe verschiedene andere Dinge ausprobiert:

Verwenden Sie einen Socket zum Empfangen anstelle des UdpClient -> Hat nicht funktioniertSetzen Sie am Reader einen Zusatz socketOption (DontRoute = 1, Broadcast = 1) -> hat nicht funktioniertGeben Sie das MulticastInterface an, das der Reader Socket verwenden soll (mit socketOption MulticastInterface) -> Hat nicht funktioniert

Antworten auf die Frage(3)

Ihre Antwort auf die Frage