如何在dpkt writer中使用实时捕获头中的时间戳?

2024-04-29 04:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在写一个包捕获实用程序时遇到了一些问题。我目前正在使用pcapy打开一个livebytestream和dpkt来解码数据包。我还想将数据包写入一个.pcap文件,该文件与dpkt.编写器对象,但是,记录在pcap文件中的时间戳来自写入程序将包写入pcap文件时,而不是网络接口或内核接收到消息时。在

我从文档中了解到,在编写时,您可以提供ts供编写器使用,但是我不知道如何从接收到的包的头中提取它。从我可以找到的示例中,可以看到如何从读取文件中打印时间戳,我似乎可以简单地打印从bytestream接收到的元组的第一个值,但是当我这样做时,我得到以下错误:

TypeError:int()参数必须是字符串、类似对象的字节或数字,而不是“Pkthdr”

错误很明显:我必须在Pkthdr对象中找到timestamp属性,但在pcapy项目或dpkt中都找不到任何解释如何解析“header”的文档/示例

我还尝试使用pypcap库进行实时捕获,但是输出是相同的。我还尝试过在Python2.7.5上使用相同的代码,因为我读到dpkt可能还不能完全支持python3,但是在两个版本上都有相同的结果

#!/usr/bin/env python3.6
import pcapy
import dpkt

cap = pcapy.open_live("eth0", 65435, True, 100)
writer = dpkt.pcap.Writer(open("test.pcap", 'wb+'))
while True:
    (header,packet) = cap.next()
    writer.writepkt(packet, header)
    print('packet printed')

为了证明pcap中的时间戳是从写入时开始的,我在再次写入同一个包之前添加了sleep period。您将看到这两个文件在头时间戳上显示了约1秒的差异:

^{pr2}$

我不太依赖pcapy或dpkt,因此如果有更好的方法,我愿意关闭这些库中的任何一个,但是我有一种感觉,有一点经验的人可以告诉我如何挖掘Pkthdr对象,将时间戳提取为str,然后在向pcap:

ts = %unpack from header%
writer.writepkt(packet, ts)

编辑:所以我查看了pcapy模块中pkthdr对象的源代码,发现了一些有用的东西:似乎有一个名为“getts”的函数可以从对象中获取时间戳:

static PyMethodDef p_methods[] = {
  {"getts", (PyCFunction) p_getts, METH_VARARGS, "get timestamp tuple 
(seconds, microseconds) since the Epoch"},
  {"getcaplen", (PyCFunction) p_getcaplen, METH_VARARGS, "returns the length 
of portion present"},
  {"getlen", (PyCFunction) p_getlen, METH_VARARGS, "returns the length of 
the packet (off wire)"},
  {NULL, NULL}  /* sentinel */
};

在python代码中,我这样调用函数:

timestamp = header.getts()

它返回一个元组,其中包含头的秒和微秒,例如(1555710256942645)。下一步是将它连接成一个数字并输入到dpkt writer ts中


Tags: 文件the对象packet时间pcaptimestampwriter
1条回答
网友
1楼 · 发布于 2024-04-29 04:25:57

好吧,我已经解决了我的问题。时间戳精度以微秒为单位,并且.pcap中的两个副本的时间戳精度相同。在

#!/usr/bin/env python3.6
import pcapy
import dpkt
import time

cap = pcapy.open_live("em2", 65435, True, 100)
(header,packet) = cap.next()
timestamp = header.getts()
print (timestamp)
writer = dpkt.pcap.Writer(open("test.pcap", 'wb+'))
while True:
    (header,packet) = cap.next()
    ts = header.getts()
    now = time.time()
    print (ts)
    timestamp = ts[0] + (float(ts[1])/1000000))
    writer.writepkt(packet, timestamp)
    time.sleep(1)
    writer.writepkt(packet, timestamp)
    print('packet printed')

相关问题 更多 >