从pcap文件读取数据包时出现问题。dpkt模块。怎么回事?
我正在运行一个测试脚本,想从我下载的一个示例.pcap
文件中读取数据包。但这个脚本似乎无法运行。我已经安装了所有需要的模块,但没有一个示例能够正常工作。
import socket
import dpkt
import sys
pcapReader = dpkt.pcap.Reader(file("test1.pcap", "rb"))
for ts, data in pcapReader:
ether = dpkt.ethernet.Ethernet(data)
if ether.type != dpkt.ethernet.ETH_TYPE_IP: raise
ip = ether.data
src = socket.inet_ntoa(ip.src)
dst = socket.inet_ntoa(ip.dst)
print "%s -> %s" % (src, dst)
不知道为什么,这个脚本没有被正确解析。当我运行它时,出现了
KeyError: 138
module body in test.py at line 4
function __init__ in pcap.py at line 105
Program exited.
这是为什么呢?哪里出了问题?我的安装有问题吗?我在一台Mac上使用Python 2.6。
4 个回答
-2
看起来你需要一些帮助……我对pcap一无所知,所以我只能尽量帮你自己解决问题。这里有几点建议:
(1) 你有没有查看一下pcap.py文件的第105行?我猜“KeyError: 138”意味着它在尝试访问一个字典,但这个字典里没有138(或者“138”)这个键。那138是什么变量呢?是来自某个数据包的字节吗?
(2) 可以考虑问问pcap的作者或者维护者。
(3) 也可以考虑提供一个pcap的链接。
1
在dpkt.pcap模块的第105行,使用了pcap文件的链接类型来访问一个链接类型映射的字典:
self.dloff = dltoff[self.__fh.linktype]
这个dltoff字典在模块的顶部定义,但它没有包含键138,所以你看到的异常就是这个原因。根据tcpdump的链接类型页面,值138代表的是LINKTYPE_APPLE_IP_OVER_IEEE1394的链接类型。如果这不是你期望的链接类型,那么pcap文件可能已经损坏。否则,你可以尝试更新dltoff字典,给138添加一个条目。根据它的数据包结构,它的头部长度是18个字节。所以在dkpt/pcap.py的第40行后添加以下指令应该可以解决问题:
LINKTYPE_APPLE_IP_OVER_IEEE1394 = 138
dltoff[LINKTYPE_APPLE_IP_OVER_IEEE1394 ] = 18
1
做这个:
pcapReader = dpkt.pcap.Reader(open('test1.pcap'))
而不是做这个:
pcapReader = dpkt.pcap.Reader(file("test1.pcap", "rb"))