Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UDP套接字每65536个数据包就有一个数据包丢失_Python_Sockets_Networking - Fatal编程技术网

Python UDP套接字每65536个数据包就有一个数据包丢失

Python UDP套接字每65536个数据包就有一个数据包丢失,python,sockets,networking,Python,Sockets,Networking,我使用pythonsocket接收FPGA发送的UDP数据包,并使用一个自定义的帧计数器来指示数据包丢失。我的问题是收到的数据每收到65536个数据包就有4个数据包丢失。windows套接字是否有65536数据包限制? 我无法在我的帖子中嵌入图片。我将在下面键入运行结果: start: 395070354 end: 395344794 Number of packets: 274441 Missing 4 packet from: 395115893 to: 395115898 distance

我使用pythonsocket接收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)
导入套接字
导入时间
导入线程
def receive():
全球数据
而不是杀死。是否设置为()
data.append(fpga.recvfrom(512)[0])
fpga=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
bind(('192.168.253.8',34))
未命中=0
数据=[]
kill=threading.Event()
p=线程。线程(目标=接收)
p、 开始()
时间。睡眠(10)
kill.set()
计数=长度(数据)
start=int.from_字节(数据[0][0:4],byteorder='big')
end=int.from_字节(数据[count-1][0:4],byteorder='big')
打印(“开始:”,开始)
打印(“结束:”,结束)
打印(“数据包数:”,结束-开始+1)
对于范围内的i(0,计数-1):
current=int.from_字节(数据[i][0:4],byteorder='big')
next=int.from_字节(数据[i+1][0:4],字节顺序='big')
如果下一个<当前:
打印(“检测到故障!!!”)
打破
步进=下一个电流
未命中=未命中+步骤1
如果步骤>1:
打印(“缺失”,第1步,“数据包形式:”,当前,“至:”,下一步,“距离形式开始:”,当前开始)
打印(“丢失的数据包数:”,未命中)

我怀疑这与Windows有关,我认为这是故意丢弃数据包,因为它们的格式不正确/不符合规范(例如,校验和计算错误,这是一个16位的数字)


为了弄清楚发生了什么,我建议使用数据包嗅探器(例如Wireshark、tcpdump、Scapy)记录Python脚本看到的相同流量。如果幸运的话,过滤“格式错误”的数据包将找到“丢失”的数据包。否则,您可以尝试在捕获的网络流量中查找数据包,其中包含一个序列号应该使这变得非常容易。您还可以更改Python代码以记录时间戳,这可能有助于缩小范围。

我注意到的第一件事:
range(0,count-1)
将包含
count-1
项。所以我想知道你们是否在处理最后一项。OP这样做是为了让他们能够“两两”比较数据包(即
当前
下一个
变量)。此外,“丢失的数据包”在中间,而不仅仅是“最后一个”项目。你能肯定发送端是否发送了所有的数据包/正确地构建它们?如果使用不同的UDP客户端,它们是否成功接收/接收方式不同?Wireshark可以正确捕获所有数据包。因此,我认为这个问题与我的FPGA设计无关。网络堆栈问题并不是未知的——下一步是确认数据包是否到达python代码。或者你可以使用另一个客户端,看看它是否显示相同的差距?也许,我必须使用pyshark代替。谢谢。这实际上是校验和问题。在校验和计算的最后一步中,将较高的16位与较低的16位相加,得到0xffff。