如何获取 Udp 缓冲区大小超过丢失的数据包
How To Get Udp Buffer Size Exceeded Packets Which Are Lost
我需要使用缓冲区大小 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 的缓冲区大小。
不,您无法获取太大的 UDP 数据包部分(无论 IP 级分段和重组如何)。数据报的要点是它们作为一个单元到达;你的逻辑不会通过实现额外的重组层来简化,而不是仅仅使用足够大的缓冲区(你应该从你的协议中知道)。
我需要使用缓冲区大小 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 的缓冲区大小。
不,您无法获取太大的 UDP 数据包部分(无论 IP 级分段和重组如何)。数据报的要点是它们作为一个单元到达;你的逻辑不会通过实现额外的重组层来简化,而不是仅仅使用足够大的缓冲区(你应该从你的协议中知道)。