Я пытался выполнить захват некоторых пакетов с помощью libpcap и использовал pcap_findalldevs для поиска устройств, доступных для захвата.
int main(int argc, char* argv[]) {
char errbuf[PCAP_ERRBUF_SIZE];
pcap_if_t* dev_list, *dev;
int rt = pcap_findalldevs(&dev_list, errbuf);
dev = dev_list;
while (dev != NULL) {
printf("device: %s, description: %s\n", dev->name, dev->description);
dev = dev->next;
}
pcap_t* pcap = pcap_create(NULL, errbuf);
if (!pcap) {
fprintf(stderr, "pcap_create() failed: %s\n", errbuf);
exit(1);
}
int msg = pcap_activate(pcap);
if ( msg > 0) {
fprintf(stderr, "pcap_activate() generates warning: %s\n", pcap_geterr(pcap));
} else if (msg < 0) {
fprintf(stderr, "pcap_activate() failed: %s\n", pcap_geterr(pcap));
pcap_close(pcap);
exit(1);
}
...
}
Ни одно устройство не распечатано, и при запуске этого кода произошел сбой pcap_activate()
. Но это не имеет смысла, если на моей машине нет устройства для захвата.
Я просмотрел предыдущий вопрос, опубликованный об этой же проблеме: ( libpcap - pcap_findalldevs возвращает NULL на MacOSx )
В этом случае проблема заключалась в привилегии кода. Поэтому я попытался sudo мой код, но он не работает.
Примечание: я запускал этот код в подсистеме ubuntu Linux Windows 10.
Моя распечатка cmd:
$ ./client
pcap_activate() failed: socket: Invalid argument
$ sudo ./client
[sudo] password for User:
pcap_activate() failed: socket: Invalid argument