Heim > Backend-Entwicklung > C++ > Wie rufe ich die IP-Adressen einer Linux-Maschine programmgesteuert in C ab?

Wie rufe ich die IP-Adressen einer Linux-Maschine programmgesteuert in C ab?

Mary-Kate Olsen
Freigeben: 2024-12-10 00:19:14
Original
332 Leute haben es durchsucht

How to Programmatically Retrieve a Linux Machine's IP Addresses in C  ?

So rufen Sie IP-Adressen einer Linux-Maschine in C ab

Problem:

Bestimmen Sie die IP-Adressen eines Linux Maschine programmgesteuert mit C, gezielt auf die öffentliche IP-Adresse unter mehreren potenziellen Zielen Adressen.

Lösung:

Verwendung von getifaddrs()

Die Funktion getifaddrs() bietet eine zuverlässigere Methode zum Abrufen von IP-Adressen unter Linux und POSIX -kompatible Betriebssysteme. Es gibt eine verknüpfte Liste von ifaddrs-Strukturen zurück, die jeweils eine Netzwerkschnittstelle und die zugehörigen Adressen darstellen. Hier ist ein Codebeispiel, das seine Verwendung demonstriert:

#include <stdio.h>      
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h> 
#include <string.h>
#include <arpa/inet.h>

int main (int argc, const char * argv[]) {
    struct ifaddrs * ifAddrStruct=NULL;
    struct ifaddrs * ifa=NULL;
    void * tmpAddrPtr=NULL;

    getifaddrs(&amp;ifAddrStruct);

    for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
        if (!ifa->ifa_addr) {
            continue;
        }
        if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4
            // is a valid IP4 Address
            tmpAddrPtr=&amp;((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
            char addressBuffer[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
            printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); 
        } else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6
            // is a valid IP6 Address
            tmpAddrPtr=&amp;((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
            char addressBuffer[INET6_ADDRSTRLEN];
            inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
            printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); 
        } 
    }
    if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);
    return 0;
}
Nach dem Login kopieren

Im Code füllt getifaddrs() die verknüpfte Liste ifAddrStruct mit Netzwerkschnittstelleninformationen. Jede ifaddrs-Struktur enthält ein ifa_addr-Mitglied, das einen Zeiger auf die Socket-Adressstruktur darstellt, die die IP-Adresse darstellt. AF_INET ist für IPv4-Adressen und AF_INET6 ist für IPv6-Adressen.

Der Code durchläuft die verknüpfte Liste, prüft, ob ifa_addr gültig ist, und ruft dann die IP-Adresszeichenfolge ab und druckt sie aus, indem er sie in eine menschliche Adresse umwandelt. lesbares Format mit inet_ntop().

Um die öffentliche IP-Adresse zu identifizieren, können Sie den Namen der Netzwerkschnittstelle überprüfen (z. B. „eth0“) oder vergleichen Sie die IP-Adressen, um festzustellen, welche mit dem externen Netzwerk übereinstimmt.

Das obige ist der detaillierte Inhalt vonWie rufe ich die IP-Adressen einer Linux-Maschine programmgesteuert in C ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage