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 argc, char *argv[]) { bpf_u_int32 netaddr=0, mask=0; struct bpf_program filter; pcap_t *descr = NULL; struct pcap_pkthdr pkthdr; const unsigned char *packet = NULL; struct ip *ipptr = NULL; struct tcphdr *tcpptr = NULL; if (argc < 2 || argc > 3 || (argv[1][0] == '-' && argv[1][1] == 'h')){ printf("Usage: tcpsniffer <interface> | tcpsniffer -f <dumpfile>\n"); exit(1); } if (argc == 2) { descr = Pcap_open_live(argv[1], MAXBYTES2CAPTURE, 1, 512); Pcap_lookupnet(argv[1], &netaddr, &mask); } else { // argc == 3 descr = Pcap_open_offline(argv[2]); } Pcap_compile(descr, &filter, "tcp", 1, mask); Pcap_setfilter(descr, &filter); while (1){ packet = Pcap_next(descr, &pkthdr); if (packet == NULL) { if (pcap_file(descr) != NULL) { printf("\nend of dumpfile!\n"); } else { printf("\n loop was broken out of with pcap_breakloop!\n"); } exit(1); } ipptr = (struct ip *)(packet + 14); printf("\n\nReceived Packet Size: %d bytes\n", pkthdr.len); printf("\n\nthe IP packets version: %d\n", ipptr->ip_v); printf ("the IP packets total_length is :%d\n", ntohs(ipptr->ip_len)); printf ("the IP protocol is %d\n", ipptr->ip_p); printf ("Destination IP: %s\n", inet_ntoa(ipptr->ip_dst)); printf ("Source IP: %s\n", inet_ntoa(ipptr->ip_src)); tcpptr = (struct tcphdr *) (packet + 14 + ipptr->ip_hl*4); printf ("Destination port : %d\n", ntohs(tcpptr->th_dport)); printf ("Source port : %d\n", ntohs(tcpptr->th_sport)); printf ("the seq of packet is %u\n", ntohl(tcpptr->th_seq)); } 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; }