Следующий пример кода из документации 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 или я что-то не так делаю?