system() ausgabe abfangen
-
Hallo C++'ler
ich versuche die lokale IP-Adresse in einen String zu speichern.
In der Console Ausgeben ist kein Problem, geht einfach übersystem("ifconfig wlan0 | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'");
Das Problem ist, das ich diese Ausgabe als String, besser als char* benötige.
Oder gibt es eine andere Möglichkeit die lokale IP als char* zu erhalten?Ich hoffe Ihr könnt mir helfen.
Mit freundlichen Grüßen
David
-
popen(3) oder gleich getifaddrs(3) (hat sogar ein Bsp.!).
-
vielen dank, den ersten Link werde ich bestimmt noch öfters brauchen
Das mit der IP habe ich mittlerweile anders gelöst.
int fd; struct ifreq ifr; char buffer[256]; fd = socket(AF_INET, SOCK_DGRAM, 0); ifr.ifr_addr.sa_family = AF_INET; strncpy(ifr.ifr_name, "wlan0", IFNAMSIZ-1); ioctl(fd, SIOCGIFADDR, &ifr); close(fd); sprintf(buffer, "%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
-
So nebenbei sei bemerkt, dass in einem C++-Programm
system
fast immer die falsche Lösung ist (gilt eigentlich für praktisch jede Programmiersprache).system
ist ineffizient und das parsen der Ausgabe unzuverlässig. Das Ausgabeformat könnte sich bei der nächsten Version ein wenig verändern. Schon bei meinem Fedora 16 ist die Ausgabe "inet xxx.xxx.xxx.xxx" statt "inet addr: xxx.xxx.xxx.xxx".System startet einen Prozess, was eine relativ teure Angelegenheit ist. In deinem Fall sogar mehrere. Nämlich insgesamt 6: eine shell, die den String erst mal versteht und dann 5 Prozesse in der Pipe. Und selbst deine Pipe ist nicht wirklich sinnvoll gestaltet. Vielen ist leider nicht bekannt, dass awk grep ersetzen kann. Und wenn man sowieso awk aufruft, kann man sich grep sparen.
Außerdem matcht das
grep 127.0.0.1
auch bei 127101011, da der Punkt für ein beliebiges Zeichen steht. Was Du mit dem cut machst, verstehe ich nicht.Überhaupt, wie kommt es, dass Du die 127.0.0.1 auf dem wlan0-interface erwartest? Es ist normalerweise auf dem Loopback interface konfiguriert.
Dein Aufruf wäre in etwa so effizienter:
ifconfig wlan0 | awk '/inet addr:/ && ! /127\.0\.0\.1/ { print $1 }'
Das reduziert die Anzahl der Prozesse um 3.
Deine letzte Lösung ist allerdings die richtige. Das ist viel besser, als mit system zu hantieren.