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