Maison > développement back-end > C++ > Comment obtenir par programme l'adresse IP publique d'une machine Linux en C ?

Comment obtenir par programme l'adresse IP publique d'une machine Linux en C ?

Patricia Arquette
Libérer: 2024-12-10 09:18:14
original
466 Les gens l'ont consulté

How to Programmatically Get a Linux Machine's Public IP Address in C  ?

Comment obtenir par programme les adresses IP d'une machine Linux en C

Introduction :

Cet article aborde un défi de programmation courant : déterminer les adresses IP d'une machine Linux exécutant une application écrite en C . L'accent ici est sur l'obtention de l'adresse IP externe ou publique du serveur.

Énoncé du problème :

La tâche est de développer un programme C qui récupère les adresses IP. d'une machine Linux, notamment celle affectée à un réseau spécifié (l'IP publique). Cela garantit que l'application peut se lier à l'adresse externe souhaitée pour la communication réseau.

Solution :

Pour résoudre ce problème, nous exploitons l'appel de fonction getifaddrs(), qui fait partie du standard POSIX et donc disponible sous Linux. Cette fonction fournit un moyen pratique de parcourir toutes les interfaces réseau et de récupérer leurs adresses IP.

Implémentation :

Le code C suivant montre comment utiliser getifaddrs() fonction :

#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

Explication :

Ce code parcourt toutes les interfaces réseau à l'aide de la boucle ifa et vérifie la famille d'adresses de chaque interface. S'il s'agit d'IPv4 ou d'IPv6, il convertit l'adresse en chaîne et l'imprime avec le nom de l'interface.

Cette approche vous permet de détecter toutes les adresses IP attribuées à la machine Linux et d'identifier l'adresse IP publique souhaitée pour la liaison. fins.

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