2

我正在使用 UDP 和 Android 通过无线网络发送数据包,并使用 Python 接收数据包。我正在发送相当时间敏感的数据,并且我遇到了一个问题,即数据包的读取速度不够快/正确。基本上,为了衡量实际问题,我测量了连续数据包之间的时间。下面是这样的一系列数据包,它们每 20 毫秒从另一个应用程序发送一次。

如您所见,在第 19 包左右,事情开始变得混乱。有 50 毫秒的延迟,然后立即读取下一个连续的数据包,就好像它们已经到达一样。数据包 40 很好地证明了它实际上变得多么糟糕。距离最后一个数据包 110 毫秒,然后在 2 毫秒内有 4 个数据包。

我已经用 Wireshark 验证了数据包实际上是定期发送的(所以问题似乎与其他应用程序无关)

我的问题是这些,回答最合适的一个:

  1. 我可以做些什么来解决问题,或者我应该采取哪些进一步的步骤来分析它?
  2. 是否有可用的套接字选项可以帮助我?
  3. 我做 Python UDP 错了吗?

下面是一个描述数据包流的简单图表。下面是我用来读取 UDP 数据包的 python 代码。

N   (ms)
1    21
2    21
3    19
4    21
5    20
6    19
7    20
8    19
9    20
10   18
11   21
12   20
13   21
14   20
15   19
16   20
17   25
18   18
19   50
20   0.23
21   08
22   29
23   09
24   21
25   26
26   18
27   83
28   0.21
29   0.35
30   0.75
31   23
32   70
33   1.21
34   0.23
35   0.21
36   20
37   22
38   11
39   20
40   110
41   0.69
42   0.42
43   0.44
44   0.39
45   13

这是网络代码。self.callback将消息放入 python 队列,另一个线程从中读取。我正在使用CPython 3.3. 该问题至少在另外 2 台计算机上仍然存在(相同的症状,我尚未使用 Wireshark 验证或测量时间)

self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

def start(self):
    while 1:
        try:
            received_data, address = self.socket.recvfrom(576)
            received_time = time.perf_counter()

            if self.is_correct_protocol(received_data):
                seq_id = struct.unpack(">H", received_data[4:6])[0]

                if self.test_already_acknowledged(address, seq_id):
                    if not self.check_and_handle_ping_request(address, unpack(received_data), received_time):                            
                        self.callback(address, received_time, unpack(received_data))
4

0 回答 0