基于libpcap的以太网数据测试 1. libpcap介绍 libpcap(Packet Capture Library),即数据包捕获函数库。在网络包抓取中libpcap是非常常用的一个库,著名的tcpdump就是用它来实现的。 libpcap是一个与实现无关的访问操作系统所提供的分组捕获函数库,用于访问数据链路层。这个库为不同的平台提供了一致的C函数编程接口,在安装了 libpcap 的平台上,以 libpcap 为接口写的程序、应用,能够自由地跨平台使用。它支持多种操作系统。 网站提供了libpcap各个版本的源码。libpcap也有编译好的版本,在windows上叫做winpcap,和libpcap完全兼容,并且提供相同的API。 2. 米尔SDK环境的建立 这个过程参考文档《MYD-YG2LX_linux软件开发指南.pdf》中,2.2.2节 安装米尔定制SDK的相关说明。 3. libpcap的交叉编译 1) 从libpcap网站现在最新的源码: libpcap-1.10.4 2)解压源码到ubuntu系统中的合适目录中:tar xvf libpcap-1.10.4.tar.gz 3)进入目录: cd libpcap-1.10.4 4)首先建立编译环境,执行:source/opt/yg2lx/environment-setup-aarch64-poky-linux 测试编译器,在提示符下执行 ${CC} –v ,如果查看到编译器的相关版本信息,说明编译器环境已经建立。 5)执行libpcap的工程配置: ./configure –host=aarch64-linux - -with-pcap = linux 看到配置结果,没有任何异常错误信息,表示配置成功,生产了Makefile文件。 6) 执行 make命令,完成编译,生成库文件。这个过程通常相当顺利。生成的库文件通过file命令查看的结果。 7)然后建立一个目录,用来存放编译的结果文件:mkdir _install 执行:make install DESTDIR=/home/xxx/…/libpcap-1.10.4/_install 完成安装。 在安装目录下面生成了所需要的库文件和头文件等 4. 开发板部署 将交叉编译出的结果压缩一下,在安装目录下执行 tarcvf libpcap.tar.gz * 并且将生成的压缩文件复制到开发板上。 并且按照目录结构将所有文件解压缩到 /usr目录中,完成部署。 5. libpcap的基本使用方法 看了一些网络上的教程,也看了官方的文档,基本了解了libpcap的使用流程和方法。 (1)接口选择。可以通过libpcap提供的接口函数列出系统内所有可以被监视的接口对象,但是我们通常希望指定所选择的接口。 在Linux中,可能的以太网接口可以是ethx,例如eth0。 在windows中,这个接口的名字比较复杂,但是我们可以通过一个简单的小程序软件获取所有接口的名称,然后选定需要的接口名称字符串来使用。 (2)初始化pcap。初始化过程中,需要提供设备接口名称,就是(1)中选定的。是否起用混杂模式,以及读取的超时时间等。 (3)过滤条件设定。过滤条件可以包含例如协议类型、端口号、物理地址等,但是libpcap需要创建一个规则集合,编译并且使用它。这个过程分为三个相互紧密关联的阶段。 规则集合被置于一个字符串内,并且被转换成能被pcap读的格式(因此编译它)。编译实际上就是在我们的程序里调用一个不被外部程序使用的函数。接下来告诉 pcap使用它来过滤出所需的数据帧。 (4)执行捕获。pcap进入它的主体执行循环。在这个阶段内pcap一直工作到它接收了所有我们想要的包为止。每当它收到一个包就调用回调解析函数,这个函数可以做我们想要的任何工作,它可以剖析所有捕获的包并给用户打印出结果,它可以将结果保存为一个文件,或者什么也不作。 (5)在嗅探到所需的数据后,我们要关闭会话并结束。 6. libpcap的简单测试 进入libpcap-1.10.4/testprogs/目录中,执行make 命令完成例程的编译。我们选择其中的几个例程在开发板上测试执行一下。 6.1 例程findalldevstest测试 赋予执行权限后,./findalldevstest 执行,输出了非常多的信息 root@myir-yg2lx:~/pcap-test#./findalldevstest eth0 Flags: UP, RUNNING (connected) Address Family: Unknown (17) Address Family: AF_INET Address: 172.17.100.101 Netmask: 255.255.0.0 Broadcast Address:172.17.255.255 Address Family: AF_INET6 Address:fe80::a8cb:7dff:fea6:e76d Netmask: ffff:ffff:ffff:ffff:: any Description: Pseudo-device thatcaptures on all interfaces Flags: UP, RUNNING lo Flags: UP, RUNNING, LOOPBACK Address Family: Unknown (17) Address Family: AF_INET Address: 127.0.0.1 Netmask: 255.0.0.0 Address Family: AF_INET6 Address: ::1 Netmask:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff eth1 Flags: UP (disconnected) Address Family: Unknown (17) docker0 Flags: UP (disconnected) Address Family: Unknown (17) Address Family: AF_INET Address: 172.17.0.1 Netmask: 255.255.0.0 Broadcast Address:172.17.255.255 dummy0 Flags: Address Family: Unknown (17) sit0 Flags: Address Family: Unknown (17) can0 Flags: wlan0 Flags: WIRELESS (not associated) Address Family: Unknown (17) bluetooth-monitor Description: Bluetooth Linux Monitor Flags: WIRELESS nflog Description: Linux netfilter log(NFLOG) interface Flags: nfqueue Description: Linux netfilter queue(NFQUEUE) interface Flags: dbus-system Description: D-Bus system bus Flags: dbus-session Description: D-Bus session bus Flags: Preferreddevice is on network: 172.17.0.0/255.255.0.0 通过信息可以发现,eth0连接了网线,可以正常使用。 6.2 例程opentest测试 通过opentest命令可以正确的打开eth0网口,说明了libpcap库部署已经成功了。 6.3 例程writecaptest测试 查看所有接口 捕获eth0网口数据,并存储到1.pcap文件中,这个文件可以通过wireshark软件解析。将这个文件复制到windows环境中。 通过wireshark软件打开刚才1.pcap文件,可以看到通过libpcap记录的网络数据帧信息。 7. 在开发板上基于libpcap的程序开发 8. Windows上的测试程序 在windows上,使用winpcap来代替libpcap库,它们是全兼容的,安装可以参考它的官方网站: Windows上的测试程序在QT中实现,调用winpcap的库。 9. 测试 执行windows的QT测试程序,向网络上发送数据,数据发送间隔大约100us。 wireshark捕获到windows测试程序发送的内容:协议类型为0x88BA 交叉编译源码,并将编译后的执行文件上传到开发板中。 赋予执行权限,chmod +x pcaptest 执行文件 ./pcaptest 将成功通过过滤的以太网帧数据显示了出来,说明libpcap可以正确的捕获到以太网数据,并且对于地址的过滤功能也已经起到了作用。
|