Python 如何获取丢失的超过Udp缓冲区大小的数据包

Python 如何获取丢失的超过Udp缓冲区大小的数据包,python,sockets,networking,udp,Python,Sockets,Networking,Udp,我需要使用缓冲区大小2048通过python在udp上进行通信,我使用下面的代码从udp进行侦听,但是我丢失了缓冲区大小之后的部分,并且随着下一条消息缓冲区大小超出,数据包的部分不再出现。 缓冲区大小超出部分不应该留在操作系统或内核缓冲区中,当我收到数据包时它会丢失吗 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

我需要使用缓冲区大小2048通过python在udp上进行通信,我使用下面的代码从udp进行侦听,但是我丢失了缓冲区大小之后的部分,并且随着下一条消息缓冲区大小超出,数据包的部分不再出现。 缓冲区大小超出部分不应该留在操作系统或内核缓冲区中,当我收到数据包时它会丢失吗

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(('', PORT))
    s.setblocking(0)
    print(s)
    while (True):
        print(s.getsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF))
        result = select.select([s], [], [])
        msg = result[0][0].recv(2048)
        msg = msg.decode('ascii')
        print(len(msg))
        print(isinstance(msg, str))
        print(msg)

s.close()
编辑:
Thx的家伙们,现在我明白了,我不应该发送超过缓冲区的包。此外,似乎最好不要使用超过1500的缓冲区大小。

不,您无法获取UDP数据包中过大的部分(无论IP级别的碎片和重新组装)。数据报的要点是它们作为一个单元到达;通过实现额外的重组层,而不仅仅是使用足够大的缓冲区(您应该从协议中了解),您的逻辑将不会得到简化。

不,您无法获得UDP数据包中太大的部分(无论IP级别的碎片和重组如何)。数据报的要点是它们作为一个单元到达;通过实现额外的重组层,而不仅仅是使用足够大的缓冲区(您应该从协议中了解),您的逻辑将不会得到简化。

发送大于网络MTU(通常约1500字节)的UDP数据包往往(AFAIK)不可靠。有些系统会丢弃数据包,有些会截断数据包,有些会实际执行“正确”的操作,然后将数据包分解,然后重新组装。我不知道你在问什么,也无法根据你的代码重现你的问题(没有发送者)。另外,请提供您得到的确切错误消息以及您得到它的确切位置。UDP最适用于相对较小的数据报。使用UDP一次发送的数据越多,丢失数据包时丢失的数据就越多,也会丢失数据包。发送大于网络MTU(通常约1500字节)的UDP数据包往往(AFAIK)不可靠。有些系统会丢弃数据包,有些会截断数据包,有些会实际执行“正确”的操作,然后将数据包分解,然后重新组装。我不知道你在问什么,也无法根据你的代码重现你的问题(没有发送者)。另外,请提供您得到的确切错误消息以及您得到它的确切位置。UDP最适用于相对较小的数据报。您尝试使用UDP一次发送的数据越多,丢失数据包时丢失的数据越多,数据包也会丢失。