Maison > développement back-end > C++ > Comment récupérer par programme les adresses IP d'une machine Linux en C ?

Comment récupérer par programme les adresses IP d'une machine Linux en C ?

Mary-Kate Olsen
Libérer: 2024-12-10 00:19:14
original
332 Les gens l'ont consulté

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

Comment récupérer les adresses IP d'une machine Linux en C

Problème :

Déterminer les adresses IP d'un Linux machine par programmation en utilisant C , ciblant spécifiquement l'adresse IP publique parmi plusieurs potentiels adresses.

Solution :

Utilisation de getifaddrs()

La fonction getifaddrs() fournit une méthode plus fiable pour récupérer des adresses IP sous Linux et POSIX -systèmes d'exploitation compatibles. Il renvoie une liste chaînée de structures ifaddrs, chacune représentant une interface réseau et ses adresses associées. Voici un exemple de code démontrant son utilisation :

#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;
}
Copier après la connexion

Dans le code, getifaddrs() remplit la liste chaînée ifAddrStruct avec des informations sur l'interface réseau. Chaque structure ifaddrs contient un membre ifa_addr, qui est un pointeur vers la structure d'adresse de socket représentant l'adresse IP. AF_INET est destiné aux adresses IPv4 et AF_INET6 aux adresses IPv6.

Le code parcourt la liste chaînée, vérifie si l'ifa_addr est valide, puis récupère et imprime la chaîne d'adresse IP en la convertissant en une valeur humaine. format lisible à l'aide de inet_ntop().

Pour identifier l'adresse IP publique, vous pouvez vérifier le nom de l'interface réseau (par exemple, "eth0") ou comparez les adresses IP pour déterminer laquelle correspond au réseau externe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal