Я пытаюсь сделать простой захват пакетов с помощью pcap, поэтому я создал дескриптор для прослушивания через eth0. Моя проблема связана со строкой pcap_loop(handle, 10, myCallback, NULL);
в конце моего кода. Я пытаюсь использовать pcap_loop
. Ожидаемый результат должен быть:
eth0
Activated!
1
2
3
...
10
Done processing packets!
В текущем выходе отсутствуют приращения:
eth0
Activated!
Done processing packets!
В настоящее время он просто переходит к «Готово обрабатывать пакеты!» и я понятия не имею, почему. Даже если он не переходит к обратному вызову, он все равно должен ожидать пакетов, так как параметр ;count (см. документацию по pcap_loop) установлен на 10.
#include <iostream>
#include <pcap.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void myCallback(u_char *useless, const struct pcap_pkthdr* hdr, const u_char*packet){
static int count = 1;
std::cout <<count<<std::endl;
count ++;
}
int main(){
char errbuf[PCAP_ERRBUF_SIZE];
char * devName;
char* net;
char* mask;
const u_char*packet;
struct in_addr addr;
struct pcap_pkthdr hdr;
bpf_u_int32 netp;
bpf_u_int32 maskp;
pcap_if_t *devs;
pcap_findalldevs(&devs, errbuf);
devName = pcap_lookupdev(errbuf);
std::cout <<devName<<std::endl;
int success = pcap_lookupnet(devName, &netp, &maskp, errbuf);
if(success<0){
exit(EXIT_FAILURE);
}
pcap_freealldevs(devs);
//Create a handle
pcap_t *handle = pcap_create(devName, errbuf);
pcap_set_promisc(handle, 1);
pcap_can_set_rfmon(handle);
//Activate the handle
if(pcap_activate(handle)){
std::cout <<"Activated!"<<std::endl;
}
else{
exit(EXIT_FAILURE);
}
pcap_loop(handle, 10, myCallback, NULL);
std::cout <<"Done processing packets!"<<std::endl;
//close handle
pcap_close(handle);
}