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

使用Python和Scapy无法获取UDP数据包的dport问题求助

问题解决:Scapy捕获UDP包后无法获取dport的错误

错误原因

sniff()函数返回的是数据包列表(哪怕设置count=1,返回的也是长度为1的列表)。你原代码中直接用packet[UDP]去访问,相当于用UDP类作为列表索引,这是错误的——列表只能用整数索引定位元素,所以才会抛出'list' object has no attribute 'dport'的异常。

修正方案

需要先从列表中取出具体的数据包对象,再访问UDP层的dport字段。

方案1:手动处理列表元素

from scapy.layers.inet import UDP, IP
from scapy.sendrecv import sniff 

# 捕获数据包,返回列表
packet_list = sniff(filter="UDP and src='127.0.0.1'", count=1)
# 判断是否捕获到数据包,再取出第一个元素
if packet_list:
    pkt = packet_list[0]
    # 访问UDP层的目的端口
    print(pkt[UDP].dport)
else:
    print("未捕获到符合条件的UDP数据包")

方案2:利用sniff的prn参数直接处理

可以通过prn参数传入处理函数,捕获到数据包时自动执行,无需手动处理列表:

from scapy.layers.inet import UDP, IP
from scapy.sendrecv import sniff 

def handle_packet(pkt):
    # 先判断数据包是否包含UDP层,避免异常
    if UDP in pkt:
        print(pkt[UDP].dport)

# 捕获时直接调用处理函数
sniff(filter="UDP and src='127.0.0.1'", count=1, prn=handle_packet)

额外提示

  • 建议不要用from scapy.layers import *这种全量导入,容易引发命名冲突,按需导入所需层即可。
  • 访问数据包层之前,最好先判断该层是否存在(比如if UDP in pkt),避免因捕获到的数据包不符合预期而抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:35:00