int main(int argc, char **argv) { char *dev = NULL; char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *descr; memset(&descr, 0, sizeof(descr)); const u_char *packet = NULL; struct ether_header *eptr; /* net/ethernet.h */ memset(&eptr, 0, sizeof(eptr)); struct bpf_program fp; /*выражение фильтрации в составленном виде */ memset(&fp, 0, sizeof(fp)); bpf_u_int32 maskp = 0; /*маска подсети */ bpf_u_int32 netp = 0; /* ip */ if (argc != 2) { fprintf(stdout, "Usage: %s \"expression\"\n", argv[0]); //Если кол-во аргументов <> 2, показываем пользователю, как работать с программой exit(0); } /* Получение имени сетевого адаптера */ dev = Pcap_lookupdev(errbuf); //Все функции-обертки для этого задания см. в файле unp.h (line 245+) /* Получение ip и маски сети для выбранного адаптера */ Pcap_lookupnet(dev, &netp, &maskp, errbuf); /* Открытие устройства в promiscuous-режиме (требуются права администратора) */ descr = Pcap_open_live(dev, BUFSIZ, 1,-1, errbuf); printf("DEVICE: %s \n", dev); /* Собираем фильтр */ Pcap_compile(descr, &fp, argv[1], 0, netp); /* Применяем фильтр*/ Pcap_setfilter(descr, &fp); /* Обратный вызов */ Pcap_loop(descr, -1, callback, NULL); pcap_close(descr); return 0; }
int main() { int count = 0; char *device = NULL; pcap_t *descr = NULL; /*获取第一个适合捕获的网络设备名称*/ device = Pcap_lookupdev(); printf("Opening device %s\n", device); /*以混杂模式打开网络设备*/ descr = Pcap_open_live(device, MAXBYTES2CAPTURE, 1, 512); /*死循环并在每一次接收到数据包时调用回调函数processPacket()*/ pcap_loop(descr, -1, processPacket, (u_char *)&count); return 0; }