gethostbyname () возвращает только адрес локального хоста в Linux - PullRequest
1 голос
/ 03 июня 2011

Я пытаюсь портативно (Windows & Linux) найти все IP-адреса локальной машины. Метод, который я использую, заключается в том, чтобы сначала вызвать gethostname (), а затем передать результат этого в gethostbyname (), который возвращает массив IP-адресов.

Проблема в том, что в Linux единственный адрес, который я получаю, это 127.0.0.1. Это работает в Windows, и я видел, как некоторые люди утверждают, что это не будет работать в Linux, если ваша сеть была настроена с помощью DHCP (не знаю, верно ли это утверждение).

Разве это не правильный способ сделать это в Linux?

Ответы [ 2 ]

1 голос
/ 03 июня 2011

Это не правильный путь в Unix / Linux.Правильный способ заключается в том, что ioctls извлекает необходимую информацию.

struct ifreq ifc_buffer[MAX_NUM_IFREQ];
ioctl(s, SIOCGIFCONF, &ifc)  # Interface list
num_ifreq = ifc.ifc_len / sizeof(struct ifreq);
for(cnt=0;cnt<num_ifreq;cnt++)
  struct ifreq *ifr = &ifc.ifc_req[cnt]
  ioctl(s, SIOCGIFADDR, ifr); # get ip address

Существуют также более современные методы, включающие:

if_nameindex()

Выполнение поиска SO для if_nameindex и SIOCGIFCONF приведет к числувопросы, подобные этому.

1 голос
/ 03 июня 2011

Это происходит потому, что в большинстве дистрибутивов это есть в /etc/hosts:

127.0.0.1       localhost.localdomain   localhost aiur

gethostbyname просто разрешает имя хоста (aiure в этом примере) в адрес.Если он найдет его в /etc/hosts, он более чем счастлив дать вам это.

Вернуться к вопросу.К сожалению, я не верю, что вы можете получить все адреса вашей машины в портативном виде.Вы можете сделать это Unix-переносимым способом, как ifconfig.Откройте сокет s и выполните ioctl(..., SIOCGIFCONF, ...).

Кстати, gethostbyname устарел , если вы считаете, что kernel.org и устарел , если выверю MSDN.

...