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

如何去除接收的DHCP报文重复项,仅在MAC或IP更新时输出数据

DHCP报文去重抓取实现方案

实现逻辑

  • 新增设备缓存字典,存储已输出过的设备MAC与对应IP的映射关系
  • 仅当报文同时包含mac、ip、主机名、厂商四个必填字段时才处理,缺失字段的报文直接跳过
  • 满足以下两个条件之一才输出新条目:
    • 当前设备MAC从未出现在缓存中
    • 当前设备MAC已存在,但对应IP和缓存中存储的IP不一致
  • 输出完成后更新缓存记录

修复后的代码

import pyshark

capture = pyshark.LiveCapture(interface='wlo2', bpf_filter='udp port 68')
capture.sniff_continuously(packet_count=16)

# 缓存结构:{MAC地址: 对应已记录的IP地址}
device_cache = {}

for packet in capture:
    # 每次循环新建fields字典,避免上一次包的字段残留
    fields = {}
    try:
        # 先取必填字段,任意缺失直接跳过当前包
        fields['mac'] = packet.dhcp.hw_mac_addr
        fields['vendor'] = packet.dhcp.option_vendor_class_id
        fields['h_name'] = packet.dhcp.option_hostname
        fields['ip'] = packet.dhcp.option_requested_ip_address
        # 可选字段,缺失不影响输出
        fields['sub_mask'] = getattr(packet.dhcp, 'option_subnet_mask', None)
        fields['server_ip'] = getattr(packet.dhcp, 'option_dhcp_server_id', None)
        fields['domain_name'] = getattr(packet.dhcp, 'option_domain_name', None)
        fields['dns'] = getattr(packet.dhcp, 'option_domain_name_server', None)
    except AttributeError:
        # 存在必填字段缺失,直接跳过当前包
        continue
    
    # 去重判断:MAC未记录 或 MAC已记录但IP更新
    current_mac = fields['mac']
    current_ip = fields['ip']
    if current_mac not in device_cache or device_cache[current_mac] != current_ip:
        print(packet.sniff_time, current_mac, current_ip, fields['h_name'], fields['vendor'])
        # 更新缓存
        device_cache[current_mac] = current_ip

输出效果说明

针对你提供的示例运行日志,修改后代码只会输出以下3条有效内容,重复条目会被过滤:

2021-12-02 11:08:19.485258 34:1c:f0:6a:c9:00 192.168.1.5 M2006C3MII-Redmi9 android-dhcp-10
2021-12-02 11:25:19.461249 e0:13:b5:8f:xx:xx 192.168.1.5 vivo-1807 dhcpcd-8.1.0
2021-12-02 11:25:19.769917 e0:13:b5:8f:xx:xx 192.168.1.6 vivo-1807 dhcpcd-8.1.0

内容的提问来源于stack exchange,提问作者roXx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:45:04