这个问题很老,但对于可能会遇到这个问题的新人来说。github 'chains' 项目同时使用 pypcap 和 dpkt 来完成这种事情(免责声明:我参与了所有三个项目 :) https://github.com/SuperCowPowers/chains
- chains/sources/packet_streamer.py(显示使用 pypcap 进行“嗅探”的代码)
- chains/links/packet_meta.py(显示使用 dpkt 进行数据包解析的代码)
对于那些只想使用 pypcap/dpkt 的人来说,这里有一个工作代码片段:
import pcap
import dpkt
sniffer = pcap.pcap(name=None, promisc=True, immediate=True)
for timestamp, raw_buf in sniffer:
output = {}
# Unpack the Ethernet frame (mac src/dst, ethertype)
eth = dpkt.ethernet.Ethernet(raw_buf)
output['eth'] = {'src': eth.src, 'dst': eth.dst, 'type':eth.type}
# It this an IP packet?
if not isinstance(eth.data, dpkt.ip.IP):
print 'Non IP Packet type not supported %s\n' % eth.data.__class__.__name__
continue
# Grab ip packet
packet = eth.data
# Pull out fragment information
df = bool(packet.off & dpkt.ip.IP_DF)
mf = bool(packet.off & dpkt.ip.IP_MF)
offset = packet.off & dpkt.ip.IP_OFFMASK
# Pulling out src, dst, length, fragment info, TTL, checksum and Protocol
output['ip'] = {'src':packet.src, 'dst':packet.dst, 'p': packet.p,
'len':packet.len, 'ttl':packet.ttl,
'df':df, 'mf': mf, 'offset': offset,
'checksum': packet.sum}
print output