Найти адрес устройства с помощью libpcap - PullRequest
2 голосов
/ 28 ноября 2010

Я пытаюсь найти адрес устройства в моем компьютере.Пока мне удалось получить список устройств (с помощью pcap_findalldevs), но я не могу понять, как добраться до этих адресов.Я видел эту man-страницу - http://www.tcpdump.org/pcap3_man.html, где написано что-то вроде этого

адресует указатель на первый элемент списка адресов для интерфейса

И тогда это

Каждый элемент списка адресов имеет тип pcap_addr_t и имеет следующие члены:

Итак, у меня есть этот код

pcap_if_t *alldevsp , *device;

 char *devname , **devs;
 int count = 1 , n;

 if(pcap_findalldevs(&alldevsp, errbuf))
 {
  printf("Error: %s" , errbuf);
  exit(1);
 }

 device = alldevsp;
 pcap_addr_t list;
 printf("\nDevices:\n");
 while(device != NULL)
 {
  printf("%d. %s - %s", count++ , device->name , device->description);
  list = device->addresses[0];
  printf("address: %s\n",(char *) inet_ntoa(list.addr));
  device = device->next; 
 }

Компиляция в порядке, но когда я пытаюсь ее запустить, я получаю следующее:

Устройства: 1. адреса eth0 - (null): 144.208.30.8 2. адреса wlan0 - (null):128.213.30.8 Ошибка сегментации

Я могу понять, что segfault, поскольку третье устройство - это usb, и у него нет адреса, но эти IP для eth0 и wlan0 неверны, они не совпадают.

Что я делаю не так?

1 Ответ

2 голосов
/ 28 ноября 2010

По вашей ссылке:

Each element of the list of addresses is of type pcap_addr_t,
and has the following members:
    ...
    addr
        a pointer to a struct sockaddr containing an address
    ...

Теперь, что такое struct sockaddr? Посмотреть здесь: http://www.retran.com/beej/sockaddr_inman.html

Итак, где вы делаете это:

printf("address: %s\n",(char *) inet_ntoa(list.addr));

Вы должны делать что-то вроде этого:

printf("address: %s\n", inet_ntoa(((struct sockaddr_in*)list.addr)->sin_addr));

То есть вам нужно извлечь «IP-адрес» (если это действительно семейство AF_INET), иначе вы даете inet_ntoa неверный тип аргумента.

...