libpcap、struct、dpkt、scapy、pyshark五种方式获取pcap原始包的速度对比

123 篇文章 5 订阅
57 篇文章 1 订阅
from pylibpcap.pcap import rpcap
import struct
from dpkt.pcap import Reader
from scapy.all import rdpcap
#from scapy.all import PcapReader
import pyshark
from timeit import repeat
import time

fileName = "/Users/microfat/Downloads/new/N1N2.pcap"
def libpcap_test():
    for _, _, packet in rpcap(fileName):
        pass

def orig_test():
    string_data = None
    with open(fileName, 'rb') as fpcap:
        string_data = fpcap.read()

    packet_num = 0
    packet_data = []
    i =24

    while(i<len(string_data)):
        packet_len = struct.unpack('I',string_data[i+12:i+16])[0]
        packet_data.append(string_data[i+16:i+16+packet_len])
        i = i+ packet_len+16
        packet_num+=1
    for packet in packet_data:
        pass

def dpkt_test():
    with open(fileName, 'rb') as f:
        for _, packet in Reader(f):
            pass

def scapy_test():
    for packet in rdpcap(fileName):
        pass

def pyshark_test():
    cap = pyshark.FileCapture(fileName, use_json=True, include_raw=True)
    for packet in cap:
        packet.get_raw_packet()

if __name__ == "__main__":
    libpcap_test_time = repeat(stmt=libpcap_test, repeat=100, number=1)
    time.sleep(1)
    orig_test_time    = repeat(stmt=orig_test, repeat=100, number=1)
    time.sleep(1)
    dpkt_test_time    = repeat(stmt=dpkt_test, repeat=100, number=1)
    time.sleep(1)
    scapy_test_time   = repeat(stmt=scapy_test, repeat=100, number=1)
    time.sleep(1)
    pyshark_test_time = repeat(stmt=pyshark_test, repeat=100, number=1)

    print('libpcap:', sum(libpcap_test_time)/len(libpcap_test_time))
    print('orig:   ', sum(orig_test_time)/len(orig_test_time))
    print('dpkt:   ', sum(dpkt_test_time)/len(dpkt_test_time))
    print('scapy:  ', sum(scapy_test_time)/len(scapy_test_time))
    print('pyshark:', sum(pyshark_test_time)/len(pyshark_test_time))
libpcap: 0.00011515187999975751
orig:    0.0005123037399994246
dpkt:    0.0010648190799918212
scapy:   0.05218072557000596
pyshark: 0.7941113060799978

结论:
libpcap > struct > dpkt > scapy > pyshark

pylibpcap由于使用到了Cython libpcap,因而速度非常快

但在功能易用性上来说大致是相反的结论

参考:https://stackoverflow.com/a/56119892

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是在Windows上获取libpcap并编写读取pcap文件的程序的步骤: 1. 下载WinPcap:WinPcap是Windows版本的libpcap,可以从其官方网站(https://www.winpcap.org/)下载最新版本的安装程序。 2. 安装WinPcap:下载安装程序后,运行它并按照向导的指示安装WinPcap。 3. 配置开发环境:在Windows上编写libpcap程序需要使用C语言,因此需要安装相应的编译器和IDE。可以选择Visual Studio或MinGW等。 4. 创建一个新项目:在IDE中创建一个新的C语言项目。 5. 添加libpcap库:将WinPcap安装目录中的lib文件夹添加到项目的库目录中,并将wpcap.lib和Packet.lib添加到项目依赖项中。 6. 编写程序代码:在项目中添加一个新的C文件,并使用libpcap API编写读取pcap文件的程序。以下是一个简单的示例程序: ```c #include <stdio.h> #include <pcap.h> void process_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *buffer); int main() { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *handle; struct pcap_pkthdr header; const u_char *packet; char filename[] = "test.pcap"; handle = pcap_open_offline(filename, errbuf); if (handle == NULL) { fprintf(stderr, "Couldn't open file %s: %s\n", filename, errbuf); return 1; } pcap_loop(handle, 0, process_packet, NULL); pcap_close(handle); return 0; } void process_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *buffer) { printf("Packet length: %d\n", header->len); } ``` 7. 编译和运行程序:使用IDE编译程序,然后运行它以读取pcap文件。程序将打印读取的每个数据的长度。 这样,就可以在Windows上使用libpcap编写读取pcap文件的程序了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值