IP-Adresse auslesen
-
Hallo zusammen,
wie bekomme ich unter Linux die IP-Adresse über eine API raus?
Die HW-Adresse habe ich mittlerweile.
Allerdigs verstehe ich einfach nciht, wie ich die IP abfragen kann.Hat da jemand enen funktionierenden Code-Schnippsel?
Für die HW Adresse mache ich das wie folgt:
void print_networking() { int sock_fd = socket( AF_INET , SOCK_DGRAM , 0 ); if( sock_fd == -1 ) { printf("Error: creating socket.\n"); } struct ifreq ifr; strcpy( ifr.ifr_name , "eth0" ); if( ioctl( sock_fd , SIOCGIFHWADDR , &ifr ) == -1 ) { printf("problems with ioctl.\n"); } printf("Netzwerk wlan0: %s\n" , ether_ntoa( (struct ether_addr*) ifr.ifr_hwaddr.sa_data ) ); close( sock_fd ); }
Nur wie gehts für die IP-Adresse? Google konnte mir da auch nicht wirklich helfen..
Wie bekomme ich eigentlich einen Überblick über verfügbare APIs unter Linux? MSDN for Linux? :p
-
z.B. http://checkip.dyndns.org/ benutzen.
-
Wenn du die interne willst, dann z.B. so:
void print_networking() { int sock_fd = socket( AF_INET , SOCK_DGRAM , 0 ); if( sock_fd == -1 ) { printf("Error: creating socket.\n"); } struct ifreq ifr; strcpy( ifr.ifr_name , "eth1" ); if( ioctl( sock_fd , SIOCGIFADDR , &ifr ) == -1 ) { printf("problems with ioctl.\n"); } printf("Netzwerk eth1: %s\n" , inet_ntoa( ((struct sockaddr_in *) (&ifr.ifr_addr))->sin_addr )); close( sock_fd ); }
Steht doch sogar schon hier, wo dein Beispiel ja anscheinend auch herkommt.
-
-
Edwart schrieb:
Wie bekomme ich eigentlich einen Überblick über verfügbare APIs unter Linux? MSDN for Linux? :p
Mittels manpages und glibc Doku.
-
Ja, das Beispiel lief bei mir leider nicht, daher habe ich mir mittlerweile eine alternative gesucht.
Die Infos über Netzwerk-Devices liegt ja auch in systemdateien, die während der laufzeit aktualisiert werden.diese lese ich einfach aus
sehr unsauber, aber besser las nüchts.
-
welche headerdateien brauch man alles dafür um das kompilieren zu können?
-
Das oben geschriebene und auch das, was im FAQ-Beitrag steht, klappt aber natürlich nur bei ziemlich einfach konfigurierten Systemen.
Zum einen kann es mehrere Interfaces mit unterschiedlichen IPs geben, zum anderen kann ein einzelnes Interface (auch ohne alias-Interfaces) mehr als eine IP-Adresse besitzen. Mehrere Interfaces werden immerhin beim FAQ-Eintrag berücksichtigt, aber mehrere IP-Adressen auf einem Interface nicht. Das ist auch keine theoretische Spielerei, für redundante Server wird das auch so eingesetzt, da kann ein einzelner Server mehr als eine internet-gültige IP besitzen. Im Terminal "ip address show" eingeben zeigt die aktuell vorhandenen IP-Adressen an, auch mehrere pro Interface.
Fazit ist normalerweise, dass man als Client einfach direkt sendet, was man möchte, ohne vorher die eigene IP-Adresse abzufragen. Wenn man die eigene IP-Adresse braucht, muss man die Gegenstelle fragen, was die sieht. Ein Server bindet oft an 0.0.0.0 und damit an alle lokalen IP-Adressen gleichzeitig, oder er ist konfigurierbar und es ist die Aufgabe des Users die IP-Adresse für bind() korrekt einzutragen.