Я новичок в использовании libpcap.
Я использую эту библиотеку для захвата пакета, и код, который я написал для захвата пакета, приведен ниже.
Интерфейс, который яПри прослушивании всегда заполняется пакет arp, поэтому на интерфейс всегда поступает пакет. Но я не могу подключить эти пакеты.Интерфейс работает и работает.Я не получил ошибку в функции pcap_open_live.
Код находится в C. И я запускаю этот код на 32-битной машине FreeBSD10.
void captutre_packet(char* ifname , int snaplen) {
char ebuf[PCAP_ERRBUF_SIZE];
int pflag = 0;/*promiscuous mode*/
snaplen = 100;
pcap_t* pcap = pcap_open_live(ifname, snaplen, !pflag , 0, ebuf);
if(pcap!=NULL) {
printf("pcap_open_live for %s \n" ,ifname );
}
int fd = pcap_get_selectable_fd(pcap);
pcap_setnonblock(pcap, 1, ebuf);
fd_set fds;
struct timeval tv;
FD_ZERO(&fds);
FD_SET(fd, &fds);
tv.tv_sec = 3;
tv.tv_usec = 0;
int retval = select(fd + 1, &fds, NULL, NULL, &tv);
if (retval == -1)
perror("select()");
else if (retval) {
printf("Data is available now.\n");
printf("calling pcap_dispatch \n");
pcap_dispatch(pcap , -1 , (pcap_handler) callback , NULL);
}
else
printf("No data within 3 seconds.\n");
}
void
callback(const char *unused, struct pcap_pkthdr *h, uint8_t *packet)
{
printf("got some packet \n");
}
Я всегда получаю значение 0, которое равнотайм-аут.Я не знаю, что происходит под капотом, я следую учебному пособию, и они также сделали то же самое, что я не знаю, что мне не хватает.
Я также хочу понять, как пакет изПосле того, как полученный уровень Ethernet копируется в этот открытый bpf-сокет / устройство (с использованием pcap_open_live) и как копируется буфер из пространства ядра в пространство пользователя?
И как долго мы можем нажатьпакет до тех пор, пока ядро не поглотит или не отклонит пакет?