dpkt没有生成tcp对象

时间:2015-11-02 18:20:52

标签: python

尝试使用dpkt来解析pcap。得到以下示例代码,但它给出了错误:

Traceback (most recent call last):
  File "te.py", line 14, in <module>
    print tcp.sport
AttributeError: 'str' object has no attribute 'sport'

刚刚安装了Ubuntu 14.04 64bit,python 2.7.6。已安装的模块&#34; dpkt&#34;使用&#34; pip&#34;,但不确定dpkt上的版本是什么。

#examples
#   https://jon.oberheide.org/blog/2008/10/15/dpkt-tutorial-2-parsing-a-pcap-file/
#   https://bytes.com/topic/python/answers/944167-dpkt-parsing-pcap-file
import dpkt
import sys

f = open(sys.argv[1])
pcap = dpkt.pcap.Reader(f)

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    ip = eth.data
    tcp = ip.data
    print tcp.sport
f.close()

1 个答案:

答案 0 :(得分:0)

这两个评论是正确的。从无链接层(例如TCP或UDP)读取的数据包。 因此,在读取数据包中的下一层之前,请检查其是否存在。

这将帮助您:

# Check for TCP or UDP packets
if ip.p == dpkt.ip.IP_PROTO_TCP or ip.p == dpkt.ip.IP_PROTO_UDP:

在您的示例中,它看起来像这样:

import dpkt
import sys

f = open("email1b.pcap")
pcap = dpkt.pcap.Reader(f)

for ts, buf in pcap:
    eth = dpkt.ethernet.Ethernet(buf)
    ip = eth.data
     
     # Check if there is TCP in packet
     if ip.p == dpkt.ip.IP_PROTO_TCP:
        tcp = ip.data
        print tcp.sport

     else:
        print "there is no TCP in the packet"

f.close()