Следующий пример кода из документации Libpcap дает следующий код, который должен сообщить об этом IP-адрес данного интерфейса (eth0 в данном случае) [Проверка ошибок для краткости опущены]pcap_lookupnet возвращает неправильный IP-адрес
#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 с одинаковыми результатами). После кода с этого вопроса: Get IP address of an interface on Linux сообщает правильный IP-адрес. Это ошибка в libpcap или я делаю что-то неправильно?
Итак, я неверно истолковал «номер сети», чтобы строго обозначить сетевую часть адреса хоста, а не IP-адрес? Если это так, пример кода (а также несколько книг по программированию pcap) очень вводят в заблуждение такими строками, как: 'bpf_u_int32 net; \t \t/* Наш IP */' –
Определенно вводящий в заблуждение и плохо информированный. Учитывая сетевую маску 'm' и ip-адрес' i', номер сети 'n' задается' n = i & m'. – mvds
В любом случае, вы могли бы объяснить это дальше? Я борюсь с той же проблемой. – Jim