我正在使用 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
然后你可以使用例如scapy处理该流量
#!/usr/bin/env python
from scapy.all import *
scapy_cap = rdpcap('traffic.pcap')
for packet in scapy_cap:
# process packets...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)