Pakete emfangen/auslesen
-
Hallo!
Ich möchte Ethernet-Pakete lesen und habe mich dabei erst einmal auf das Ausgeben von Ziel-MAC, Quell-MAC und Ethertype beschränkt. Der Ethertype wird auch richtig ausgelesen, aber mit den MAC Adressen will es noch nicht so recht klappen.
Das Testprogramm welches mir Pakete verschickt liefert die MACs:
00:15:58:65:F9:D2 //Ziel
00:15:58:65:F9:D1 //QuelleDiese MACs sind original HardwareAdressen. Die verschickten Pakete sind nach Kontrolle mit Ethereal korrekt. Untenstehender Code liefert mir sowohl für Quell- aus auch für Zielmac den gleichen Wert 00:15:58:65:F9:D2. Warum gibt er mir zweimal das Gleiche aus, auch wenn ich verschiedene Teile des Headers abfrage?
Hat jemand einen Tip wo mein Fehler liegt?
//Pakete empfangen // Includes #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <net/ethernet.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <netinet/ether.h> // Main Part int PEmpfangen(void) { int sock, int packetsize = sizeof(struct ether_header) ; char packet[packetsize]; struct ether_header *ethhdr = (struct ether_header *) packet; // Raw Socket oeffnen if( (sock = socket(AF_INET,SOCK_PACKET,htons(ETHERTYPE_ARP))) == -1) { perror("socket"); exit(1); } // Lese Pakete aus dem Raw Socket und gebe sie aus while(1) { read(sock,packet,packetsize); printf ("Ziel: %s \nQuelle: %s\nEthertype: %X\n ",ether_ntoa (ethhdr->ether_dhost), ether_ntoa (ethhdr->ether_shost),ethhdr->ether_type); } return 0; } }
-
Vermutlich benutzt ether_ntoa einen statischen Puffer, um den Ergebnis-String anzulegen, so dass der zweite Aufruf das Ergebnis des ersten überschreibt. Du könntest es entweder so lösen, dass du diese Ergebnisse jeweils erstmal zwischenspeicherst, oder du gibst ganz einfach beide Adressen in getrennten printf-Aufrufen aus.
printf ("Ziel: %s \n", ether_ntoa(ethhdr->ether_dhost)); printf("Quelle: %s\n", ether_ntoa (ethhdr->ether_shost)),
-
Danke Bashar,
in getrennten Aufrufen bekomme ich jetzt die Richtigen Adressen. Hätte ich ja auch von selber mal drauf kommen können das zu testen. :p
Eine Sache noch:
Vermutlich benutzt ether_ntoa einen statischen Puffer, um den Ergebnis-String anzulegen, so dass der zweite Aufruf das Ergebnis des ersten überschreibt.
Seltsamerweise erhalte ich bei beiden Einträgen den ersten Aufruf zurückgeliefert (also ether_ntoa (ethhdr->ether_dhost)), so dass also nichts überschrieben wird. Oder liegt dass an der Reihenfolge der Auswertung. In welcher Richtung wird die Zeile abgearbeitet?
-
Die Auswertungsreihenfolge von Funktionsargumenten ist unspezifiziert. In dieser Situation scheint es von rechts nach links zu sein.