python - 使用python接收高速率的UDP数据包
问题描述
我正在使用 python 来接收来自 FPGA 的 UDP 数据包流,试图丢失尽可能少的数据包。数据包速率从大约 5kHz 到一些 MHz,我们希望在特定的时间窗口(代码中的 acq_time)中获取数据。我们现在有这个代码:
BUFSIZE=4096
dataSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
dataSock.settimeout(0.1)
dataSock.bind((self.HOST_IP, self.HOST_PORT))
time0=time.time()
data_list = []
while time.time()-time0<acq_time:
fast_acquisition(data_list)
def fast_acquisition(data_list_tmp):
data, addr = dataSock.recvfrom(self.BUFSIZE)
data_list_tmp.append(data)
return len(data)
采集完成后,我们将 data_list 保存在磁盘上。
这段代码旨在尽可能简单和快速,但它仍然太慢了,即使在 5kHz 时我们也会丢失太多数据包,我们认为这是因为当我们读取并将一个数据包存储在列表中并检查时间时,下一个(矿石)到达并丢失。有什么办法让插座保持打开状态吗?我们是否可以通过并行处理“串联”打开多个套接字,以便当我们从第一个保存文件时,第二个可以接收另一个数据包?我们甚至可以考虑只使用另一种语言来接收数据包并将其存储在磁盘上。
解决方案
您可以使用tcpdump
(在 C 中实现)来捕获 UDP 流量,因为它比python
:
#!/bin/bash
iface=$1 # interface, 1st arg
port=$2 # port, 2nd arg
tcpdump -i $iface -G acq_time_in_seconds -n udp port $port -w traffic.pcap
然后您可以使用 egscapy
来处理该流量
#!/usr/bin/env python
from scapy.all import *
scapy_cap = rdpcap('traffic.pcap')
for packet in scapy_cap:
# process packets...
推荐阅读
- c++ - 我怎么能忽略字符串中一个字符之后的所有内容?
- node.js - Issus 使用 node.js 在 Firestore 中添加新对象
- python - 通过新的 python 重写使用不和谐令牌制作不和谐垃圾邮件机器人
- c - 浮点值在 uC-OS-III 中不起作用
- c++ - NTRUEncrypt:无法正确找到使用开源标准算法中描述的两个多项式的 GCD,无法定义是否存在 poly 的逆
- c - 是否使用 strcpy
- reactjs - 编辑待办事项列表状态在与 axios 的反应中未正确传递
- jquery - 如何将 JSON 数组转换为 JSON 字符串 jquery
- java - 用于 5 GB 文件的 MapReduce
- go - net/http 服务器在 ab (ApacheBench) 重负载下冻结