使用libpcap查找设备地址

时间:2010-11-27 23:19:49

标签: c network-programming libpcap

我正在尝试在计算机中查找设备的地址。到目前为止,我设法获得设备列表(使用pcap_findalldevs),但我无法弄清楚如何到达这些地址。我看到了这个联机帮助页 - 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并且它没有地址,但是eth0和wlan0的那些IP是错误的,它们不匹配。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

从您的链接:

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错误类型的参数。