Comment puis-je récuperer l'adresse IP d'une machine (Linux)?

Comment puis-je - en programmant en C++ - détecter les adresses IP du serveur linux sur lequel tourne mon application. Les serveurs auront au moins deux adresses IP et j’ai besoin d’une adresse spécifique (celle d’un réseau donné (le réseau public)).

Pour rendre les choses un peu plus claires :

  • Le serveur aura évidemment le « localhost » : 127.0.0.1
  • Le serveur aura une adresse IP interne (de gestion) : 172.14.x.x
  • Le serveur aura une adresse IP externe (publique) : 80.190.x.x

Je dois trouver l’adresse IP externe pour y lier mon application. Évidemment, je peux aussi la lier à INADDR_ANY (et c’est d’ailleurs ce que je fais en ce moment). Actuellement je préférerais détecter l’adresse publique.

Voici un code C++ qui te permet de récupérer l’adresse IPv4 et IPv6 de votre machine Linux.

#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) { // vérifier qu'il s'agit bien d'un IPv4
            // est une adresse IPv4 valide
            tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
            char addressBuffer[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
            printf("%s Address IP %s\n", ifa->ifa_name, addressBuffer); 
        } else if (ifa->ifa_addr->sa_family == AF_INET6) {// vérifier qu'il s'agit bien d'un IPv6
            // est une adresse IPv6 valide
            tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
            char addressBuffer[INET6_ADDRSTRLEN];
            inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
            printf("%s Address IP %s\n", ifa->ifa_name, addressBuffer); 
        } 
    }
    if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);
    return 0;
}