python - 忽略旧的UDP数据包Python

标签 python performance sockets networking udp

我正在为通过 Wifi 进行通信的系统编写代码,该系统由 Android 设备通过路由器将 UDP 数据包发送到 Raspberry Pi 组成。发送的信息对时间非常关键,作为提高性能的一种方式,我正在尝试为 Pi 编写 python 代码,以在缓冲区中有更新​​的数据包时忽略旧数据包(数据指示控制接口(interface)的状态- 旧数据无用)。由于 Pi 的处理能力有限,我想避免对旧数据做额外的工作。目前代码如下:

import time
import socket

#This section of code creates the socket and shows that it is running
UDP_IP = ''
UDP_PORT = 2016
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))

while(1):
    data, addr = sock.recvfrom(1024) #receives UDP packets, buffer size is 1024 bytes
    # do time critical stuff with data

我知道 SOCK_DGRAM 如果我将缓冲区大小设置为 8(正在发送的数据中的字节数),它只会带来 8 个字节并丢弃其余的 - 这会实现我的目标,还是会带来最旧的8 个字节,还是有其他行为?

感谢您的帮助!

最佳答案

“这会带来最旧的 8 个字节吗?”是的,因为队列被实现为 FIFO ,较早发送的在队列的前面部分,因此较早离开。
处理此问题的一种方法是为自己创建一个所谓的协议(protocol),该协议(protocol)将在客户端中创建数据的时间附加到正在发送的数据包中。这样,您可以根据自己的标准忽略过时的数据包。在客户端:

from datetime import datetime
packet = b'{}:some data'.format(datetime.now())

关于python - 忽略旧的UDP数据包Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42914262/

相关文章:

python - 将 --user 与 --prefix 错误与 setup.py install 结合使用

python - 查找每列的唯一值

c# - UWP - 通过套接字将网络摄像头流式传输到 MediaElement - 图片损坏?

c - 如何确定文件描述符是否附加到 Linux 中的文件或套接字

python - 使用pika,是否可以读取rabbitmq绑定(bind)参数?

python - 从一组预先计算的绘图创建动画 : ArtistAnimation

c - 哪个更快 : bitshift vs switch

performance - 重量和性能方面的最佳数据存储格式(例如,Txt、Asc、Bin 等)?

c++ - 在不同的 Visual Studio 平台上运行时间不同?

node.js - SocketIO 广播速度太快