«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как я могу программно определить IP-адреса Linux-сервера на C++?

Как я могу программно определить IP-адреса Linux-сервера на C++?

Опубликовано 21 декабря 2024 г.
Просматривать:546

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

Программное определение IP-адресов Linux-серверов в C.

Введение

Определение IP-адресов Linux-сервера необходимо для сетевого взаимодействия и развертывания приложений. В этой статье представлено программное решение на языке C для эффективного получения IP-адресов Linux-машины.

Постановка задачи

Цель состоит в том, чтобы программно получить IP-адреса сервера Linux в приложении C. . Сервер может иметь несколько IP-адресов, включая адрес локального хоста, внутренний (управляющий) адрес и внешний (публичный) адрес. Цель состоит в том, чтобы получить внешний IP-адрес для привязки приложения.

Lösung

Стандартная библиотека C предоставляет функцию getifaddrs() для получения информации о сетевых интерфейсах и IP-адресах системы. Вот пример использования getifaddrs() для печати всех адресов IPv4 и IPv6 локального компьютера:

#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;
}

Чтобы получить внешний IP-адрес, вы можете использовать аналогичный подход, но конкретно искать интерфейс, который подключается к внешней сети. Вы можете использовать siocgifaddr с SIOCGIFADDR для получения IP-адреса определенного интерфейса.

Fazit

Функция getifaddrs() и siocgifaddr с SIOCGIFADDR предоставляют надежные методы для получения IP-адресов машины Linux в С. Эти подходы позволяют приложениям динамически адаптироваться к изменениям в сети и устанавливать необходимые сетевые соединения.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3