0

我正在运行以下测试脚本来尝试从.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

4 回答 4

1


pcapReader = dpkt.pcap.Reader(open('test1.pcap'))

代替:


pcapReader = dpkt.pcap.Reader(file("test1.pcap", "rb"))

于 2011-02-09T21:59:01.780 回答
1

dpkt.pcap 模块的第 105 行使用 pcap 文件的链接类型来访问链接类型映射的字典:

        self.dloff = dltoff[self.__fh.linktype]

dltoff 字典在模块顶部定义,它不包含键 138,因此您看到的异常。根据tcpdump 的链接类型页面,值为 138 是 LINKTYPE_APPLE_IP_OVER_IEEE1394 的链接类型。如果这不是您期望的链接类型,则 pcp 文件可能已损坏。否则,您可以尝试更新 dltoff 字典并为 138 添加一个条目。根据其数据包结构,其标头长度为 18 个字节。因此,在 dkpt/pcap.py 的第 40 行之后添加以下指令应该可以工作:

        LINKTYPE_APPLE_IP_OVER_IEEE1394 = 138
        dltoff[LINKTYPE_APPLE_IP_OVER_IEEE1394 ] = 18
于 2012-05-18T12:53:49.127 回答
-1

好吧,您似乎缺乏帮助...我不知道膝盖骨和膝盖骨,所以我所能做的就是尝试帮助您帮助自己。建议:

(1) 你看过 pcap.py 的第 105 行吗?我猜“KeyError:138”表示它正在尝试访问字典,但该字典没有 138(或“138”)作为键。包含 138 的变量是什么?数据包中的一个字节?

(2) 考虑询问 pcap 的作者/维护者。

(3) 考虑为 pcap 提供一个 URL。

于 2010-03-22T13:54:08.960 回答
-2

我也遇到过类似的问题,但是我是KEY ERROR 192。

我发现我dkpt/pcap.py的不完整,是一个很旧的版本。

所以我卸载了当前的包

sudo apt-get remove python-dpkt

使用 pip 安装最新的

pip install dpkt

这终于解决了问题,祝你好运!

于 2017-04-11T06:26:17.527 回答