我正在使用 UDP 和 Android 通过无线网络发送数据包,并使用 Python 接收数据包。我正在发送相当时间敏感的数据,并且我遇到了一个问题,即数据包的读取速度不够快/正确。基本上,为了衡量实际问题,我测量了连续数据包之间的时间。下面是这样的一系列数据包,它们每 20 毫秒从另一个应用程序发送一次。
如您所见,在第 19 包左右,事情开始变得混乱。有 50 毫秒的延迟,然后立即读取下一个连续的数据包,就好像它们已经到达一样。数据包 40 很好地证明了它实际上变得多么糟糕。距离最后一个数据包 110 毫秒,然后在 2 毫秒内有 4 个数据包。
我已经用 Wireshark 验证了数据包实际上是定期发送的(所以问题似乎与其他应用程序无关)
我的问题是这些,回答最合适的一个:
- 我可以做些什么来解决问题,或者我应该采取哪些进一步的步骤来分析它?
- 是否有可用的套接字选项可以帮助我?
- 我做 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))