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(&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=&((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=&((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; }
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!