繁体   English   中英

套接字 UDP Python 服务器丢失数据包

[英]Socket UDP Python Server Looses Packets

我正在使用 Python,但我在使用 UDP 套接字作为服务器时遇到了问题。 我从客户端发送数据包,但数据太大而无法在一个数据包(几个 MBytes)中发送,因此我将数据分成 65K 的数据包(IP 将其分成 1500 字节数据包(MTU)并在服务器中重新组合它们)。 我在 Wiresharks 中看到了数据包,因此传输没有问题。

传输代码是:

while(end == False):

        if total_length - count >= MTU:
            length_send = self._socket.sendto(msgbuff[count:count + MTU],(IP,PORT))
        else:
            length_send = self._socket.sendto(msgbuff[count:],(IP,PORT))

        count += length_send
        if count == total_length:
            end = True

问题出在接待处。 我使用同步标头来了解数据的开始位置(例如,某些固定字节为 0xB451B451)。 在某些运行中,服务器运行良好并找到同步标头,并且能够恢复所有数据包。

但是,在其他运行中,套接字仅接收块数据的最后一个数据包。 例如:块数据为 100K,第一个数据包为 65K,第二个数据包为 35K。 套接字始终返回 35K 数据包。

服务器的代码是:

while not synchronized_flag:
        msg, __ = self._socket.recvfrom(MTU)
        seq_sync = msg[0:length(SYNQ_HEADER)]
        if seq_sync == SYNQ_HEADER:
            synchronized_flag = True

total_length = getLength(msg)
bytes_read = 0
while bytes_read < total_length:
            msg_aux, _ = self._socket.recvfrom(MTU)
            msg.extend(msg_aux)
            bytes_read += len(msg_aux)

谢谢您的支持。

此外,我必须说我不能使用 TCP,因为我需要能够获得的最高速度。

请记住,UDP 不是一种可靠的协议,因此通常用于视频流等应用程序,但如果需要正确接收每个数据包,则不是。

如果要建立可靠的连接(以更高的开销和更低的速度为代价)或以最小的开销(以可能丢失数据包为代价)的连接,则必须做出决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM