You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:54:03