pcap_lookupnet возвращает неверный IP-адрес

Следующий пример кода из документации libpcap дает следующий код, который должен сообщать IP-адрес данного интерфейса (в данном случае eth0) [Проверка ошибок опущена для краткости]

#include <stdio.h>
#include <pcap.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
  char errbuf[PCAP_ERRBUF_SIZE]; 
  bpf_u_int32 mask;   
  bpf_u_int32 ip;    
  struct in_addr ip_addr;

  /* Find the properties for the device */
  pcap_lookupnet("eth0", &ip, &mask, errbuf);

  ip_addr.s_addr = ip;

  printf("IP Address: %s\n", inet_ntoa(ip_addr));

  return 0;
}

Однако это приводит к 192.168.1.0, а не к правильному 192.168.1.100. Запуск этого на другом компьютере в другой подсети дает 10.0.0.0, а не правильный 10.0.0.107, что наводит меня на мысль, что libpcap неправильно копирует последний октет. Я вручную преобразовал целое число, возвращаемое pcap_lookupnet, чтобы убедиться, что это не проблема с использованием inet_ntoa (я также пробовал inet_ntop с идентичными результатами). Следуя коду из этого вопроса: Получить IP-адрес интерфейса в Linux сообщает правильный IP-адрес. Это ошибка в libpcap или я что-то не так делаю?


person drarc    schedule 09.02.2012    source источник
comment
Связано: stackoverflow.com/a/9443991/7508077   -  person EsmaeelE    schedule 30.03.2020


Ответы (1)


Ваше утверждение «которое должно сообщать IP-адрес данного интерфейса» неверно.

Из справочной страницы:

pcap_lookupnet() используется для определения номера сети IPv4 и маски, связанной с сетевым устройством. И netp, и maskp являются указателями bpf_u_int32.

вы уверены, что у вас есть номер сети 10.0.0.107 или 192.168.1.100 соответственно? Звучит довольно необычно.

person mvds    schedule 09.02.2012
comment
Итак, я неправильно истолковал номер сети, чтобы строго означать сетевую часть адреса хоста, а не IP-адрес? Если это так, код примера (а также несколько книг по программированию pcap) сильно вводит в заблуждение такими строками, как: bpf_u_int32 net; /* Our IP */ - person drarc; 09.02.2012
comment
Определенно вводит в заблуждение и плохо информирован. Учитывая сетевую маску m и IP-адрес i, номер сети n задается n=i&m. - person mvds; 09.02.2012
comment
В любом случае, вы могли бы объяснить это дальше? Я борюсь с той же проблемой. - person Jim; 09.12.2012
comment
Сетевой адрес — это часть IP-адреса, которая является общей для всех устройств в локальной сети. Это определяется количеством битов (например, /24) или маской сети, имеющей все биты 0, кроме первого N (например, 255.255.255.0 для N=24). - person mvds; 09.12.2012