【发布时间】:2019-06-05 01:02:28
【问题描述】:
我正在使用python套接字接收FPGA发送的UDP数据包,并带有一个自定义的帧计数器来指示数据包丢失。我的问题是接收到的数据每收到 65536 个数据包丢失 4 个数据包。 Windows 套接字是否有 65536 个数据包限制? 我无法在我的帖子中嵌入图片。我将在下面输入运行结果:
start: 395070354
end: 395344794
Number of packets: 274441
Missing 4 packet from: 395115893 to: 395115898 distance from start: 45539
Missing 4 packet from: 395181429 to: 395181434 distance from start: 45539
Missing 4 packet from: 395246965 to: 395246970 distance from start: 45539
Missing 4 packet from: 395312501 to: 395312506 distance from start: 45539
Number of missing packets: 16
正如您从结果中看到的那样,它非常有规律。 395181434-395115898=65536。每 65536 个数据包丢失 4 个数据包。
我试过减慢传输速度。我认为这可能是缓冲区大小问题。我使用 setsockopt 函数更改了 RECVBUF 大小,但它不起作用。
import socket
import time
import threading
def receive():
global data
while not kill.is_set():
data.append(fpga.recvfrom(512)[0])
fpga = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
fpga.bind(('192.168.253.8', 34))
miss=0
data=[]
kill=threading.Event()
p=threading.Thread(target=receive)
p.start()
time.sleep(10)
kill.set()
count=len(data)
start=int.from_bytes(data[0][0:4], byteorder='big')
end=int.from_bytes(data[count-1][0:4], byteorder='big')
print("start: ",start)
print("end: ",end)
print("Number of packets: ",end-start+1)
for i in range(0,count-1):
current=int.from_bytes(data[i][0:4], byteorder='big')
next=int.from_bytes(data[i+1][0:4], byteorder='big')
if next < current:
print("out of order detected!!!")
break
step=next-current
miss=miss+step-1
if step > 1:
print("Missing ",step-1," packet form: ",current," to: ",next,"distance form start: ",current-start)
print("Number of missing packets: ",miss)
【问题讨论】:
-
我注意到的第一件事:
range(0,count-1)将有count-1项目。所以我想知道您是否正在处理最后一项。 -
@KlausD。 OP 这样做是为了他们可以“成对”比较数据包(即
current和next变量)。 “丢失的数据包”也在中间,而不仅仅是“最后一个”项目。 -
你能绝对确认发送端正在发送所有数据包/正确构造它们吗?如果您使用不同的 UDP 客户端,它们是否成功/不同地接收?
-
Wireshark 可以正确捕获所有数据包。所以,我认为这个问题与我的 FPGA 设计无关。
-
网络堆栈问题并非未知 - 下一步是确认数据包是否到达您的 python 代码。或者您可以使用其他客户端,看看它是否显示相同的差距?
标签: python sockets networking