【问题标题】:Ignoring old UDP packets Python忽略旧的UDP数据包Python
【发布时间】:2017-03-20 21:26:16
【问题描述】:

我正在为通过 Wifi 进行通信的系统编写代码,该系统由 Android 设备通过路由器将 UDP 数据包发送到 Raspberry Pi 组成。发送的信息对时间非常关键,作为提高性能的一种方式,我正在尝试为 Pi 编写 python 代码,以在缓冲区中有更新​​的数据包时忽略旧数据包(数据指示控制接口的状态- 旧数据无用)。由于 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 个字节中,还是有其他行为?

感谢您的帮助!

【问题讨论】:

    标签: python performance sockets networking udp


    【解决方案1】:

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

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

    【讨论】:

    • 我以为是这样。我会尝试那个解决方案。感谢您的帮助!
    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多