我正在尝试将原始以太网数据包捕获到用户空间程序中。在阅读了内核的 TAP/TUN 功能后,我继续创建了以下设置:
直接连接的两个系统(交叉电缆)。我给了他们静态 IP 10.0.0.1/24 和 10.0.0.2/24。我的代码在第二个单元上被破坏,
它成功打开设备(设置了 IFF_TAP),我可以看到 tap0 已创建,然后我开始从我得到的文件描述符中读取。此时,我正在从 10.0.0.1 向 10.0.0.2 发送 ping,虽然我认为我的代码会获取这些 ICMP 字节,但它什么也没得到。
以下是一些代码片段,基于我找到的示例:
/* Connect to the device */
strcpy(tun_name, "tap0");
tun_fd = tun_alloc(tun_name, IFF_TAP | IFF_NO_PI); /* tapinterface */
if(tun_fd < 0){
exit(1);
}
/* Now read data coming from the kernel */
while(1) {
nread = read(tun_fd,buffer,sizeof(buffer));
if(nread < 0) {
close(tun_fd);
exit(1);
}
/* Do whatever with the data */
}
对 read() 的调用将永远被阻塞并且没有数据。
然而.. 如果使用 IP 地址(例如:10.0.0.3)设置 tap0,我确实会收到来自内核的大量数据包,但不会收到来自另一台机器的 ICMP 数据包,此外,这样做会导致 ping 单元接收不到响应,直到我收到响应。删除tap0,桥接真实的(eth0)和tap0也没有达到目的,我做错了什么?
谢谢,艾坦。