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

使用Scapy捕获网络流时出现Socket错误,求排查方案

解决Scapy嗅探时的Socket错误问题

错误原因

你代码里的UDP数据包打印逻辑存在错误:UDP协议层只有sport(源端口)属性,没有src(源IP)属性,你误将packet[IP].src写成了packet[UDP].src,这会导致Scapy解析数据包时触发异常,进而引发Socket关闭的警告。

修复方案

直接修正UDP打印行的错误代码即可,同时可以优化代码的严谨性:

修正后的完整代码

def spck_clbk(packet):
    global ip_cnt
    if IP in packet:
        save_pkDATA(packet)
        ip_cnt += 1
        ip_src = packet[IP].src
        ip_trg = packet[IP].dst
        print(f"{ip_cnt}. IP Source found.... {ip_src}")
        print(f"Target IP spottet... ( -_•)︻デ═一 {ip_trg} ")
        
        if TCP in packet:
            print(f"TCP Paket: {ip_src}:{packet[TCP].sport} -> {ip_trg}:{packet[TCP].dport}")

        if UDP in packet:
            # 修正:UDP层没有src属性,改用IP层的源IP
            print(f"UDP Packet: {ip_src}:{packet[UDP].sport} -> {ip_trg}:{packet[UDP].dport}")
            
        if ICMP in packet:
            print(f"ICMP Paket: {ip_src} -> {ip_trg}")

def str_sn(interface):
    print(f"Sniffing on {interface}....")
    sniff(iface = interface, prn = spck_clbk, store = 0, filter="ip", timeout=5)

额外注意事项

  • 因为你设置了filter="ip",捕获到的数据包都包含IP层,所以把TCP/UDP/ICMP的判断放在IP判断内部,可避免重复访问packet[IP]
  • 若不确定Scapy协议层的属性,可在命令行中用ls(IP)、ls(UDP)等命令查看对应层的所有可用属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:49:51