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