pcap_lookupdev() 已弃用。怎么解决

问题描述 投票:0回答:2

由于 Lookupdev 在 libcap >=1.9 中已被弃用,因此我在 v1.8 中编写的代码中遇到了错误。我一直无法解决它。 建议我使用 pcap_findalldevs 但出现错误。

int sniffARPPackets(char* gateway, char* gateway_ipp)

{

strncpy(gtwy, gateway, 17);
strncpy(gateway_ip, gateway_ipp, 15);
int i;
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t* descr;
const u_char *packet;
struct pcap_pkthdr hdr;
struct ether_header *eptr;
struct bpf_program fp;
bpf_u_int32 maskp;
bpf_u_int32 netp;

dev = pcap_lookupdev(errbuf);

if(dev == NULL) {
    fprintf(stderr, "%s\n", errbuf);
    exit(1);
}

pcap_lookupnet(dev, &netp, &maskp, errbuf);


descr = pcap_open_live(dev, BUFSIZ, 1,-1, errbuf);
if(descr == NULL) {
    printf("pcap_open_live(): %s\n", errbuf);
    exit(1);
}


if(pcap_compile(descr, &fp, "arp", 0, netp) == -1) {
    fprintf(stderr, "Error calling pcap_compile\n");
    exit(1);
}


if(pcap_setfilter(descr, &fp) == -1) {
    fprintf(stderr, "Error setting filter\n");
    exit(1);
}


pcap_loop(descr, -1, my_callback, NULL);
return 0;

}

这是代码。

ubuntu tcpdump libpcap
2个回答
0
投票

为什么它被弃用?

引用 pcap_lookupdev 手册页:

BUGS
   The pointer returned by pcap_lookupdev() points  to  a  static  buffer;
   subsequent  calls  to  pcap_lookupdev() in the same thread, or calls to
   pcap_lookupdev() in another thread, may overwrite that buffer.

   In WinPcap, this function may return a UTF-16  string  rather  than  an
   ASCII or UTF-8 string.

你应该做什么?

引用 pcap_lookupdev 手册页:

DESCRIPTION
   This  interface  is  obsoleted  by  pcap_findalldevs(3PCAP).  To find a
   default device on which to capture, call pcap_findalldevs() and, if the
   list  it  returns  is not empty, use the first device in the list.  (If
   the list is empty, there are no devices on which capture is  possible.)

在除 Windows 之外的每个平台上,

pcap_lookupdev()
都会调用
pcap_findalldevs()
并返回第一个设备(除非它是环回设备),因此如果
pcap_findalldevs()
不起作用,
pcap_lookupdev()
也将不起作用。您遇到的错误是什么
pcap_findalldevs()


0
投票

从您想要的设备中获取名称

device = all_devs->name;

示例

int main(int argc, char *argv[]) {
    char *device;
    char error_buffer[PCAP_ERRBUF_SIZE];
    pcap_t *handle;
   
    pcap_if_t *all_devs;

    if(pcap_findalldevs(&all_devs, error_buffer) == -1){
        fprintf(stderr, "error finding devices");
        return 1;
    }

    device = all_devs->name;
    //or loop through all_devs to find the one you want

    if (all_devs == NULL) {
        printf("Error finding devices: %s\n", error_buffer);
        return 1;
    }

    /* Open device for live capture */
    handle = pcap_open_live(
            device,
            BUFSIZ,
            0,
            timeout_limit,
            error_buffer
        );

       ...

      pcap_freealldevs(all_devs);
}

说明

解析列表并从所需的设备中获取名称并将其传递给 pcap_open_live()。 pcap_openlive() 的第一个参数只是一个字符串(char *),表示设备名称。

pcap_findalldevs() 返回 pcap_if_t(每个设备的结构)的列表(指向第一个设备的指针)。该数据结构具有成员:下一个、名称、描述、地址、标志。

列表中的每个元素都是 pcap_if_t 类型,并具有以下成员:

next 如果不为 NULL,则为指向列表中下一个元素的指针;列表的最后一个元素为 NULL

name 指向字符串的指针,为要传递给 pcap_open_live() 的设备提供名称

description 如果不为 NULL,则为指向字符串的指针,给出设备的人类可读描述

addresses 指向设备网络地址列表第一个元素的指针,如果设备没有地址,则为 NULL

© www.soinside.com 2019 - 2024. All rights reserved.