raw socket接收以太网数据包时ifconfig RX计数未上升问题求助
问题原因分析
- 收到的实际是ens193的出站包:你使用
htons(ETH_P_ALL)创建的原始套接字默认会捕获经过该网卡的入站+出站双向流量,而ifconfig的RX统计只计数网卡从外部收到的入站包,出站包会计入TX统计,所以你看到的打印其实是本机从ens193发出去的包,自然不会让RX计数上涨。 - 无法确认包所属网卡:你调用
recvfrom时传入了空指针作为地址参数,没有获取包的元数据,无法确认当前捕获的包是否真的来自ens193网卡。 - 代码存在语法错误:错误处理分支的
exit;是非法写法,exit是标准库函数,必须加参数调用如exit(1);,否则触发未定义行为。
解决方案
- 过滤仅收入站包:添加套接字选项忽略出站包,Linux 2.6.36及以上内核支持该配置:
int optval = 1; setsockopt(sock, SOL_PACKET, PACKET_IGNORE_OUTGOING, &optval, sizeof(optval));
- 校验包所属网卡:修改
recvfrom逻辑,获取sockaddr_ll结构体打印网卡索引,和ens193的索引(可通过ip link show ens193命令查看开头的数字)对比,确认包来源:
struct sockaddr_ll sll; socklen_t sll_len = sizeof(sll); bytes = recvfrom(sock, buf, 1522, 0, (struct sockaddr*)&sll, &sll_len); if (bytes > 0) { printf("收到包,所属网卡索引:%d,长度:%d\n", sll.sll_ifindex, bytes); }
- 确认网卡状态:先执行
ip link set ens193 up确保网卡处于启用状态,再通过tcpdump -i ens193命令确认是否真的有入站流量进入该网卡。如果需要捕获目的MAC不是本机的广播、组播或第三方流量,还需要开启网卡混杂模式:ip link set ens193 promisc on。 - 修复错误代码:把错误分支的
exit;改成exit(EXIT_FAILURE);。
内容的提问来源于stack exchange,提问作者Cprogrammer
相关产品推荐
相关产品推荐

