"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como posso determinar programaticamente os endereços IP de um servidor Linux em C++?

Como posso determinar programaticamente os endereços IP de um servidor Linux em C++?

Publicado em 2024-12-21
Navegar:103

How Can I Programmatically Determine a Linux Server's IP Addresses in C  ?

Determinação programática de endereços IP de servidores Linux em C

Introdução

Identificar os endereços IP de um servidor Linux é essencial para comunicação de rede e implantação de aplicativos. Este artigo apresenta uma solução programática em C para recuperar efetivamente os endereços IP de uma máquina Linux.

Declaração do problema

O objetivo é obter programaticamente os endereços IP de um servidor Linux dentro de um aplicativo C . O servidor pode ter vários endereços IP, incluindo um endereço de host local, um endereço interno (de gerenciamento) e um endereço externo (público). O objetivo é recuperar o endereço IP externo para vinculação do aplicativo.

Lösung

A biblioteca C padrão fornece a função getifaddrs() para obter informações sobre as interfaces de rede e endereços IP de um sistema. Aqui está um exemplo que usa getifaddrs() para imprimir todos os endereços IPv4 e IPv6 da máquina local:

#include 
#include 
#include 

int main() {
    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) { // IPv4 address
            tmpAddrPtr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
            char addressBuffer[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
            printf("IPv4 Address %s\n", addressBuffer);
        } else if (ifa->ifa_addr->sa_family == AF_INET6) { // IPv6 address
            tmpAddrPtr = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
            char addressBuffer[INET6_ADDRSTRLEN];
            inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
            printf("IPv6 Address %s\n", addressBuffer);
        }
    }

    if (ifAddrStruct != NULL) {
        freeifaddrs(ifAddrStruct);
    }

    return 0;
}

Para recuperar o endereço IP externo, você pode usar uma abordagem semelhante, mas procurando especificamente a interface que se conecta à rede externa. Você pode usar siocgifaddr com SIOCGIFADDR para recuperar o endereço IP de uma interface específica.

Fazit

A função getifaddrs() e siocgifaddr com SIOCGIFADDR fornecem métodos robustos para recuperar os endereços IP de uma máquina Linux em C. Essas abordagens permitem que os aplicativos se adaptem dinamicamente às mudanças na rede e estabeleçam as conexões de rede necessárias.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3