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

Comment obtenir par programme l'adresse IP publique d'un serveur Linux en C ?

DDD
DDDoriginal
2024-12-24 05:24:13679parcourir

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

Détermination de l'adresse IP d'une machine Linux en C

Problème

Comment obtenir par programme les adresses IP d'un serveur Linux exécutant notre application , en particulier celui externe (public) ?

Interfaces réseau Linux

Un serveur Linux a généralement plusieurs interfaces réseau, chacune avec sa propre adresse IP. Il possède :

  • Interface de bouclage : 127.0.0.1
  • Interface de gestion interne : 172.16.x.x
  • Interface publique externe : 80.190.x.x

Solution

La fonction getifaddrs peut être utilisée pour récupérer toutes les adresses IP associées à une machine. Il fournit une liste chaînée de structures ifaddrs. Voici un exemple en C :

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

using namespace std;

int main() {
  struct ifaddrs *ifAddrStruct, *ifa;
  void *tmpAddrPtr;

  getifaddrs(&ifAddrStruct);

  for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
    if (!ifa->ifa_addr) {
      continue;
    }
    if (ifa->ifa_addr->sa_family == AF_INET) {
      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) {
      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;
}

Ce code parcourt toutes les interfaces réseau et imprime les adresses IP pour les adresses IPv4 et IPv6.

En inspectant les noms d'interface réseau (par exemple, eth0 , eth1, etc.), vous pouvez identifier l'adresse IP externe (publique) et l'utiliser pour lier votre application.

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!

Déclaration:
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