首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用python接收高速率的UDP数据包

使用python接收高速率的UDP数据包
EN

Stack Overflow用户
提问于 2018-07-21 03:09:53
回答 1查看 3.3K关注 0票数 1

我正在使用python来接收来自FPGA的UDP数据包流,试图尽可能少地丢失数据包。数据包速率从大约5 MHz到一些MHz,我们希望在特定的时间窗口(代码中的acq_time)获取数据。我们现在有了以下代码:

代码语言:javascript
复制
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保存在磁盘上。

这段代码应该是尽可能简单和快速的,但它仍然太慢,即使在5 5kHz的频率下,我们也会丢失太多的数据包,我们认为发生这种情况是因为当我们读取一个数据包并将其存储在列表中并检查时间时,下一个数据包(或其他数据包)到达并丢失。有没有办法让插座保持打开状态?我们是否可以通过并行处理“串联”打开多个套接字,这样当我们保存第一个文件时,第二个套接字可以接收另一个数据包?我们甚至可以考虑使用另一种语言来接收和存储磁盘上的数据包。

EN

回答 1

Stack Overflow用户

发布于 2018-07-21 05:13:06

UDP数据包可能丢失的原因有几个,当然,能够将它们从套接字队列中移除并存储它们的速度可能是一个因素,至少最终是这样。然而,即使你有一个专门的C语言程序来处理它们,如果你希望每秒接收超过一百万个UDP数据包,你也不太可能接收到所有的UDP数据包。

我要做的第一件事是确定python性能是否真的是您的瓶颈。根据我的经验,首先也是最重要的一点是,您更有可能会耗尽接收缓冲区空间。内核将在套接字的接收队列中存储UDP数据报,直到空间耗尽。您也许可以使用C程序来扩展该容量,但是如果数据包以足够高的速度传入,那么您耗尽空间的速度仍然会快于耗尽套接字的速度。

假设您在linux上运行,看一下如何配置套接字的接收缓冲区空间的答案--并检查系统范围的最大值,该值也是可配置的,可能需要增加。https://stackoverflow.com/a/30992928/1076479

(如果您使用的不是linux,我不能给出任何具体的指导,尽管同样的因素也可能适用。)

即使有更多的缓冲区空间,甚至在C程序中,您也可能无法足够快地接收数据包。在这种情况下,@Game0ver使用tcpdump的想法可能会更好地工作,如果你只需要承受一个短而强烈的包突发,因为它使用一个低得多的接口来获取包(并且是高度优化的)。当然,您不仅拥有UDP有效负载,还将拥有整个原始数据包,并且在处理它们之前还需要剥离IP和以太网层的报头。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51448972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档