Laden...

[Socket] SSDP Pakete (Announcements) per Udp Multicast empfangen

Erstellt von Viperos vor 3 Jahren Letzter Beitrag vor 3 Jahren 749 Views
V
Viperos Themenstarter:in
12 Beiträge seit 2017
vor 3 Jahren
[Socket] SSDP Pakete (Announcements) per Udp Multicast empfangen

Hallo,
für eine kleine Bastelei versuche ich mich derzeit daran UDP Pakete aus einer Multicastgruppe abzufischen.
Sinn und Zwecke des ganzen ist es, die SSDP/UPnP Announcements mitzubekommen und zu verarbeiten.

Ich habe mir einen kleinen Test zusammengebaut der wie ich meine eigentlich so funktionieren müsste aber nicht tut.

Anstatt die gewünschten Pakete zu empfangen, bekomme ich nur die Discovery-Messages die der lokale Client selbst in die Gruppe sendet.

Dabei ist es egal ob der lokale Endpunkt IPAddress.Any oder die konkrete IP des NICs ist.
Mitglied in der Gruppe bin ich auch sonst würde ich zumindest die Discoveryversuche nicht mitbekommen.
Per WireShark sehe ich auch die Announcements die ich eigentlich hätte abfischen wollen.

Könnt ihr mir mitteilen wo hier mein Fehler liegt?



[TestMethod]
        public void SocketTest()
        {
            int port = 1900;
            IPAddress multicastIP = IPAddress.Parse("239.255.255.250");
            IPAddress localIP = IPAddress.Any;
            IPEndPoint localEP = new IPEndPoint(localIP, port);
            using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
            {
                socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(multicastIP));
                socket.Bind(localEP);

                EndPoint ep = new IPEndPoint(multicastIP, port);
                while (true)
                {
                    var buffer = new byte[1024];
                    EndPoint senderEP = new IPEndPoint(IPAddress.Any, 0);
                    var received = socket.ReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref senderEP);
                    var message = Encoding.UTF8.GetString(buffer, 0, received);
                    Debug.WriteLine($"{senderEP}\r\n{message}");
                }

            }
        }


V
Viperos Themenstarter:in
12 Beiträge seit 2017
vor 3 Jahren

Kleines Update zwischendurch, da das Problem immer noch besteht.

Falls nicht ganz klar sein sollte was im Initialpost gemeint ist.

Ich möchte gerne folgendes aus dem Netzwerk (Multicastgruppe) abfischen.


Internet Protocol Version 4, Src: 192.168.A.B, Dst: 239.255.255.250
User Datagram Protocol, Src Port: 54628, Dst Port: 1900
Simple Service Discovery Protocol
    NOTIFY * HTTP/1.1\r\n
    HOST: 239.255.255.250:1900\r\n
    CACHE-CONTROL: max-age=70\r\n
    LOCATION: http://192.168.A.B/device.xml\r\n
    NT: urn:schemas-upnp-org:device:MediaServer:1\r\n
    NTS: ssdp:alive\r\n
    USN: urn:schemas-upnp-org:device:MediaServer:1\r\n
    \r\n

Bekomme aber immer nur:


Internet Protocol Version 4, Src: 192.168.Y.X, Dst: 239.255.255.250
User Datagram Protocol, Src Port: 50950, Dst Port: 1900
Simple Service Discovery Protocol
    M-SEARCH * HTTP/1.1\r\n
    HOST: 239.255.255.250:1900\r\n
    ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n
    MAN: "ssdp:discover"\r\n
    MX: 2\r\n
    \r\n

Als wenn der Code nur mitbekommt was meine lokale Maschine in die Gruppe sendet.
192.168.Y.X ist die IP meines Rechners der die Notifications mitbekommen soll.

Nach Suche auch in anderen Foren bin ich über einen Ratschlägen gestolpert bei dem man eine weitere Überladung von System.Net.Sockets.MulticastOption nutzen sollte, bei der man auch die lokale IP angeben muss. Es zeigte sich auch hier das selbe Bild wie oben.


socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(multicastIP, localIP));

Weiters bin ich auf die Idee gekommen das das Hyper-V evtl. das Problem sein könnte. Wurde von mir deinstalliert (inkl. NIC). Auch hier immer noch das selbe Phänomen.

V
Viperos Themenstarter:in
12 Beiträge seit 2017
vor 3 Jahren

So, jetzt bin ich zumindest in der Erkenntnis des Problems nen Stück weiter.

Szenario immer noch wie oben beschrieben.

Binde ich den Socket an die konkrete IP des Rechners auf dem ich den Test ausführe, bekomme ich wie gesagt die M-Search Requests die mein Rechner rausschickt. Jetzt bin ich mal hergegangen weil ich den Verdacht hatte das da evtl. das falsche Netzwerkinterface genutzt wird. Aktiv hab ich in Windows lediglich ein Interface (Ethernet 2). In Wireshark bekomme ich auch noch den Adapter mit dem Namen "Adapter for loopback traffic capture" angezeigt. Zeichne ich an diesem Adapter den Traffic auf, so ist zu erkennen das dieser genau die gleichen M-Search Ergebnisse anzeigt wie mein Test erkennt. Die Notifys bekomme ich in Wireshark allerdings nur auf "Ethernet 2" angezeigt. Ich schlussfolgre daraus das wohl immer noch das falsche Interface genutzt wird. Jetzt ist die Frage wie man das wieder gerade bekommt. Immerhin habe ich den lokalen Endpunkt mit der konkreten IP bereits am Socket gebunden und damit auch nicht die gewünschten Pakete empfangen.

16.807 Beiträge seit 2008
vor 3 Jahren

Adapter mit dem Namen "Adapter for loopback traffic capture" angezeigt.

Dir ist aber schon bewusst, dass das der Adapter von Npcap ist; also das Mittel, mit dem auf der Netzwerkkarte der Traffic "dupliziert" wird, damit ihn Wireshark überhaupt aufzeichnen kann?

V
Viperos Themenstarter:in
12 Beiträge seit 2017
vor 3 Jahren

Hi Abt, das ist mir klar.
Aber genau diesen Adapter (den der Test ja dann wohl zu verwenden scheint) will ich ja eben nicht nutzen.
Nur kann ich wie gesagt, selbst unter Angabe der konkreten IP des funktionierenden Adapters, den Socket nicht dazu bewegen auch die Notifications (die über den anderen Adapter eintreffen) mitzubekommen.

Nur duplizieren würde ich's nicht zwingend nennen wenn nur der halbe Traffic auf dem Adapter eintrifft.
Dann wäre es mir ja noch erstmal egal.
Denn auf dem besagten Npcap Adapter bekommt der Test nur meine ausgehenden Pakete mit. Die Eingehenden (aus dem Netzwerk/ der Gruppe) werden über diesen gar nicht angezeigt.

Edit

OK, ich habe es jetzt doch zum laufen bekommen auch wenn ich nicht ganz verstehe warum das nur so funktioniert.
Mir war nicht bekannt das ich um der Gruppe zuzuhören erstmal was senden muss. Ich habe einige Beispiele (siehe z.B. hier) gefunden in dennen direkt nach dem Beitritt zur Gruppe direkt empfangen wird ohne irgendwas zu senden.
Ist dieses Verhalten normal?

Edit 2

Der Teilerfolg war nur zeitlich begrenzt.
Es scheint als ob es zunächst funktioniert hat. Nach einer gewissen Zeit bleiben dann aber die Notifications wieder aus und es trudeln nur noch die M-Search Requests im Test ein.