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

时间:2020-03-11 08:48:13

标签: python sockets networking udp

我正在使用Python,并且UDP套接字作为服务器存在问题。我从客户端发送数据包,但数据太大,无法发送一个数据包(几个MB),因此我将数据分割为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

问题出在recepture。我使用同步头了解数据从何处开始(例如一些固定字节,如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,因为我需要能够获得的最高速度。

1 个答案:

答案 0 :(得分:0)

请记住,UDP不是reliable protocol,因此通常用于视频流之类的应用程序,但是如果需要正确接收每个数据包,则不使用UDP。

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

相关问题