Я использую сокет python для получения пакетов UDP, отправленных FPGA с определенным им счетчиком кадров, чтобы указать потерю пакетов. Моя проблема заключается в том, что полученные данные потеряли 4 пакета на каждые 65536 полученных пакетов. Есть ли в сокете 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)