gpt4 book ai didi

python - UDP 消息太长

转载 作者:太空狗 更新时间:2023-10-29 20:37:13 26 4
gpt4 key购买 nike

我正在尝试通过 UDP 发送数据,想知道为什么我的系统 (Mac OS X 10.9) 上的最大数据长度被限制为 9253 字节。

这是我发送数据的方式(简化):

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 9999
MESSAGE = "A"*9217

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

我得到了错误

Traceback (most recent call last):
File "Untitled 2.py", line 8, in <module>
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
socket.error: [Errno 40] Message too long

事实上,我可以传输的最大“字符串长度”是 9216。当我通过以下方式在客户端进行字节大小检查时

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 9999

self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.bind((UDP_IP, UDP_PORT))
data, addr = self.sock.recvfrom(65535)
print("Received {0} bytes of data.".format(sys.getsizeof(data)))

我明白了

Received 9253 bytes of data.

我不明白为什么它是 9253 字节长,当我发送 9216 字节时(这是以字节为单位的字符串长度)。 28个字节是UDP头,剩下的9个字节里存的是什么?

我的主要问题是:如何发送和接收最大 65535 字节的 UDP 数据包?

最佳答案

我遇到了同样的问题,并为您的[Errno 40] 找到了解决方案。问题不在于MTU。 MTU 是可以发送的 1 个包的最大尺寸。对于以太网,此 MTU 为 1500。

但是,计算机可以将大于 MTU 的 UDP 包分割成更小的包。这样你应该能够发送 udp 包到 65535。

现在我们来解决您的问题。默认情况下,OSX 已将最大 UDP 包限制为 9216 字节,不要问我为什么。您可以在终端中使用以下命令更改此值。

    sudo sysctl -w net.inet.udp.maxdgram=65535

此更改不会在重启后继续存在。

请注意,如果其中一个片段未到达其客户端,则整个包将被丢弃。这就是为什么将数据报的大小保持在 MTU 以下更为明智。

关于python - UDP 消息太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22819214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com