点击左上方蓝色“一口Linux”,选择“设为星标”
第一时间看干货文章 ☞【干货】嵌入式驱动工程师学习路线 ☞【干货】Linux嵌入式知识点-思维导图-免费获取 ☞【就业】一个可以写到简历的基于Linux物联网综合项目 ☞【就业】找工作简历模版
最近开发过程中遇到个小问题,
板子与客户的模块通过一款交换芯片连接,客户的模块会向我的板子发送组播报文,
但是模块和我的板子并在同一个网段,
默认情况下,这些数据包会被网卡过滤掉,
那么我要如果通过套接字接收网卡上不通网段的数据包呢?
这就涉及到一个知识点,网卡的混杂模式!
混杂模式(Promiscuous mode),简称 Promisc mode,俗称监听模式。
在 IEEE 802 定的网络规范中,每个网络帧都有一个目的MAC地址。
非混杂模式下 网卡只会接收目的MAC地址是它自己的单播帧,以及多播及广播帧;
混杂模式下 网卡会接收经过它的所有帧!
混杂模式是指一台主机能够接受所有经过它的数据流,不论这个数据流的目的地址是不是它,它都会接受这个数据包。
也就是说,混杂模式下,网卡会把所有的发往它的包全部都接收。
在这种情况下,可以接收同一集线器局域网的所有数据。
网卡工作模式有4种,分别是:
ifconfig eth0 promisc
ifconfig etho -promisc
使用ifconfig或者ip命令查看一个网卡是否开启了混杂模式,当输出包含 PROMISC 时,表明该网络接口处于混杂模式。
ip link show eth0
在输出中,查找 PROMISC 字样。如果存在,说明该网卡处于混杂模式;如果没有,说明它不在混杂模式。
ifconfig ens33
在输出中,查看是否有 PROMISC 字样。
如果想通过程序方式打开混杂模式,可以参考下面代码
struct ifreq ethreq;
strncpy(ethreq.ifr_name, "eth0", IFNAMSIZ);
if(ioctl(sock_raw_fd, SIOCGIFFLAGS, ðreq)!= 0) //获取eth0网络接口标志
{
perror("ioctl");
close(sock_raw_fd);
exit(-1);
}
ethreq.ifr_flags |= IFF_PROMISC;
if(ioctl(sock_raw_fd,SIOCSIFFLAGS,ðreq)!=0) //设置eth0网络接口标志
{
perror("ioctl");
close(sock_raw_fd);
exit(-1);
}
获取更多linux学习资料 后台回复:1024
end
一口Linux
关注,回复【1024】海量Linux资料赠送
精彩文章合集
文章推荐