由于 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;
}
这是代码。
为什么它被弃用?
引用 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()
?
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