如何去除接收的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
相关产品推荐
相关产品推荐

