我使用UDP和Android通过无线网络发送数据包,并使用Python接收。我正在发送相当时间敏感的数据,我遇到的问题是数据包没有足够快/正确读取。基本上,为了衡量实际问题,我测量连续数据包之间的时间。下面是一系列数据包,它们每20毫秒从其他应用程序发送一次。
正如你所看到的,围绕数据包19的事情开始变得混乱。有50毫秒的延迟,然后立即读取下一个连续的数据包,就像它们已经到达一样。数据包40很好地证明了它实际上有多糟糕。自上一个数据包起110毫秒,然后在2毫秒内发送4个数据包。
我已经与Wireshark验证了数据包实际上是经常发送的(所以问题似乎与其他应用程序无关)
我的问题是这些,请回答最合适的问题:
以下是描述数据包流的简单图表。下面是我用来读取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))