Является ли -> h_addr_list [0] адресом, который мне нужен? - PullRequest
1 голос
/ 19 мая 2011

Я работаю над реализацией UpNP на C ++, и мне нужно получить локальный внутренний IP-адрес, назначенный маршрутизатором, чтобы работали сокеты. Мне нужен адрес, который отображается на маршрутизаторах, где отображаются компьютеры, подключенные к маршрутизатору, и локальный IP-адрес, назначенный каждому компьютеру. Я использую это:

PHOSTENT      Addr    = NULL;
char          Host[MAX_PATH];

if( gethostname(Host, sizeof(Host)) == 0 )
{
    Address = gethostbyname( Host );
    if( Address != NULL )
    {
        //*(struct in_addr *)Address->h_addr_list[0]) <- this is my address
    }
}

Это прекрасно работает на компьютере, который я тестирую, но на этом компьютере есть только одна сетевая карта, поэтому мне было интересно, если, возможно, когда на компьютере более одной карты или сетевого устройства, Address-> h_addr_list [0] может быть не тот, который мне нужен, и это может быть в другом индексе этого массива.

Будет ли [0] всегда получать IP, назначенный маршрутизатором?

Ответы [ 2 ]

0 голосов
/ 19 мая 2011

... получить локальный внутренний IP-адрес, назначенный маршрутизатором ...

Обратите внимание, что в некоторых случаях IP-адрес устройства будет назначаться вручную, но пользователь все равно захочет использовать UPnP.

В Linux предлагается использовать getaddrinfo(3) вместо gethostbyname(3), возможно, Winsocks осуществила аналогичный переход?

В Linux для /etc/hosts характерно наличие петлевых записей, также доступных по имени хоста; /etc/gai.conf может использоваться для настройки порядка сортировки возвращаемых адресов, и, возможно, будет возвращен адрес обратной связи. Winsock позволяет системным администраторам легко изменять порядок возвращаемых адресов?

Не забывайте, что система может на законных основаниях иметь несколько вышестоящих маршрутизаторов: ноутбук с EV-DO или EDGE или аналогичное сотовое соединение для передачи данных и беспроводной или проводной Ethernet будет иметь несколько IP-адресов, несколько восходящих маршрутизаторы и таблица маршрутизации, чтобы выяснить, какой из них следует использовать для отправки каждого пакета.

Можете ли вы использовать (а) адрес, используемый клиентами для связи с вами? (getsockname(2) вернет локальный адрес, используемый в конкретном сокете.) (B) попросить пользователя выбрать среди списка IP-адресов, если их несколько? Было бы неплохо привязать к N из M интерфейсов, чтобы пользователи могли выбирать, какие сети получают услуги, а какие нет.

0 голосов
/ 19 мая 2011

(Предполагается, что здесь есть winsock, как и в предыдущем вопросе)

Не следует полагать, что первый адрес является правильным (поскольку может быть несколько интерфейсов и более одного может быть активным)

Я бы рекомендовал перечислять адреса, используя либо getaddrinfo с пустым аргументом pNodeName, либо GetAdaptersAddresses.

Оба этих возвратасвязанные списки с зарегистрированными адресами вашей системы

...