使用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
相关产品推荐
相关产品推荐

