Получение логического адреса моей системы с использованием C ++ и Linux - PullRequest
0 голосов
/ 22 апреля 2010

Подскажите, пожалуйста, как получить IP-адрес моей системы (логический адрес) с использованием C ++ и Linux.

Ответы [ 3 ]

8 голосов
/ 22 апреля 2010

«Логический адрес» не имеет смысла. Вы либо хотите получить интерфейсный адрес (IP-адрес, который находится в той же локальной сети, что и компьютер), либо вам нужен общедоступный интернет-адрес (IP-адреса хосты увидят, когда этот компьютер подключится к ним). IP-адреса будут одинаковыми, только если аппарат напрямую подключен к Интернету, что часто не соответствует действительности.

Во-вторых, узлы Linux могут (и имеют) иметь несколько интерфейсов, поэтому , который интерфейс, так же важен. Это может быть связано с маршрутизацией (в этом случае это зависит от пункта назначения), или он может использовать политику маршрутизации (что опять-таки: будет зависеть от фактического трафика).

В-третьих: узлы Linux могут иметь несколько адресов . То есть системный администратор может привязать несколько IP-адресов к интерфейсу, либо используя подчиненные интерфейсы (например, ifconfig eth0:2 ...), либо просто добавляя вторичные адреса (например, ip addr add ip dev eth0).

Именно поэтому вам лучше всего сказать пользователю, что вы хотите сделать, и попросить пользователя предоставить вам нужную информацию, или просто попытайтесь установить соединение и полагаться на система, чтобы делать правильные вещи.

В тех немногих случаях, когда вам действительно нужен IP-адрес (например, если вы внедряете FTP-клиент), правильным будет специализированный подход (в случае клиента FTP: использование результатов getsockname() на канале управления). Точное знание того, почему вы считаете, что вам нужен IP-адрес (и какая у вас информация), поможет вам лучше ответить.

1 голос
/ 22 апреля 2010

Вы спрашиваете "IP" адрес, но такого нет. Ваша система может иметь любое количество IP-адресов, даже если у вас есть только один сетевой адаптер. Для начала у вас будет как минимум 127.0.0.1 и хотя бы один IP в вашей локальной сети. Вам нужно выяснить, как определить, какой интерфейс вы хотите, а затем использовать соответствующий библиотечный вызов (который я не могу вспомнить из головы), чтобы найти IP для этого интерфейса.

1 голос
/ 22 апреля 2010

Я думаю, вы можете использовать int getifaddrs(struct ifaddrs **ifap); для получения этих данных. Прочитайте man 3 getifaddrs для получения дополнительной информации. Это может выглядеть так:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>

int main(void) {
    struct ifaddrs *ifap, *cur;

    getifaddrs(&ifap);

    for(cur = ifap; cur != NULL; cur = cur->ifa_next) {
        if(cur->ifa_addr->sa_family != AF_INET)
            continue;

        printf("address value: %s, name: %s\n",
               cur->ifa_addr->sa_data,
               cur->ifa_name);
    }

    return 0;
}
...