我获得了大学(网络工程)课程的项目,该项目涉及编写数据包嗅探器,可以捕获和识别IPv4,IPv6,TCP,UDP,IP,ICMP等数据包并显示其内容。
最初我们被指示使用libpcap来做这件事,但我们刚刚被一位大学技术人员告知,目前的安装(Arch linux)不可能使用libpcap。
在C中创建不使用libpcap的数据包嗅探器有哪些其他方法?
我不是要求这个项目的答案,我只想问方向,我应该从哪里开始?
答案 0 :(得分:5)
我会去问更高级的人你应该做的事情。这里似乎有两个完全不同的任务 - 一个是解析和显示网络数据包,另一个是与OS /硬件接口以捕获数据包。如果你应该学习前者,那么你可能不应该花时间研究后者。
答案 1 :(得分:3)
最初我们被指示使用libpcap来做这件事,但我们刚刚被一位大学技术人员告知,目前的安装(Arch linux)不可能使用libpcap。
我建议的第一件事就是从课程导师那里得到一个直接的答案。如果技术人员意味着libpcap不可用,那么你应该能够编译它。如果技术人员意味着他们(Arch或大学)从Linux内核中删除了混杂模式驱动程序,那么你就无法做很多事情。无论哪种方式,检查你听到的是什么。
如果您仍然需要这样做,那么阅读libpcap源以获得指导有什么问题? pcap_loop
是您正在寻找的功能,它从read_op
结构中调用pcap_t
。 grep -irn "read_op = " *
揭示了libpcap中低级别的几个可能的读者:
grep -irn "read_op = " *
pcap-bpf.c:2231: p->read_op = pcap_read_bpf;
pcap-bt-linux.c:172: handle->read_op = bt_read_linux;
pcap.c:243: p->read_op = (read_op_t)pcap_not_initialized;
pcap-can-linux.c:99: handle->read_op = can_read_linux;
pcap-dag.c:795: handle->read_op = dag_read;
pcap-dlpi.c:759: p->read_op = pcap_read_dlpi;
pcap-libdlpi.c:217: p->read_op = pcap_read_libdlpi;
pcap-linux.c:1198: handle->read_op = pcap_read_linux;
pcap-linux.c:3167: handle->read_op = pcap_read_linux_mmap;
pcap-netfilter-linux.c:338: handle->read_op = nflog_read_linux;
pcap-nit.c:315: p->read_op = pcap_read_nit;
pcap-pf.c:486: p->read_op = pcap_read_pf;
pcap-septel.c:213: handle->read_op = septel_read;
pcap-sita.c:941: handle->read_op = pcap_read_acn;
pcap-snf.c:236: p->read_op = snf_read;
pcap-snit.c:394: p->read_op = pcap_read_snit;
pcap-snoop.c:381: p->read_op = pcap_read_snoop;
pcap-usb-linux.c:341: handle->read_op = usb_read_linux_mmap;
pcap-usb-linux.c:355: handle->read_op = usb_read_linux_bin;
pcap-usb-linux.c:390: handle->read_op = usb_read_linux;
pcap-win32.c:687: p->read_op = pcap_read_win32_dag;
pcap-win32.c:694: p->read_op = pcap_read_win32_npf;
savefile.c:323: p->read_op = pcap_offline_read;
您的系统使用哪一个可能取决于configure
的结果,但其中任何一个都将成为了解其工作原理的重要起点。不要害怕拆开像这样的大项目 - 有人说“谷歌是你的朋友”。我认为grep
是你的朋友。
答案 2 :(得分:-1)
为什么不使用WireShark?它有ArchLinux包,非常有趣。我自己用它并取得了不错的成绩。