// pcap_loop 循环接收数据 #include // libpcap头文件 #include #include #include #include #include // 网络地址转换函数,如inet_ntoa()->将网络地址转换成“.”点隔的字符串格式 #include #include void recv_data_handler(u_char *user_arg, const struct pcap_pkthdr *caphdr, const u_char *data); int main(int argc, char const *argv[]) { // 1. 获取可用的网络设备名称 char *dev = pcap_lookupdev(NULL); // NULL表示获取默认网络设备 if (dev != NULL) { printf("网络设备名称: %s\n", dev); } // 2. 打开网络设备, 开始捕获数据 char err_buf[PCAP_ERRBUF_SIZE] = ""; pcap_t *cap = pcap_open_live(dev, 128, 0, 0, err_buf); if (cap == NULL) { printf("open pcap fail: %s\n", err_buf); return -1; } // 编译过滤规则, 成功则设置过滤规则 char filter[] = "udp dst port 8001"; struct bpf_program program; // 过滤器程序结构体,采用bpf(伯克利包过滤器) if (pcap_compile(cap, &program, filter, 0, 0xffffff00) == 0) { pcap_setfilter(cap, &program); } // 循环捕获数据 pcap_loop(cap, -1, recv_data_handler, NULL); // 关闭网卡设备 pcap_close(cap); return 0; } void recv_data_handler(u_char *user_arg, const struct pcap_pkthdr *cap_hdr, const u_char *data) { if (cap_hdr->caplen > 0) { printf("数据包长度: %d, 实际长度: %d\n", cap_hdr->caplen, cap_hdr->len); } sleep(1); }