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





  • 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.


Anmelden zum Antworten