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

时间:2019-11-24 17:06:31

标签: python sockets networking udp

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

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()

编辑: 谢谢,现在我明白我不应该发送大于缓冲区的数据包。而且似乎最好不要使用大于1500的缓冲区大小。

1 个答案:

答案 0 :(得分:3)

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