当前位置:  开发笔记 > 编程语言 > 正文

UDP消息太长

如何解决《UDP消息太长》经验,为你挑选了1个好方法。

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

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

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 
    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数据包?



1> 小智..:

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

但是,计算机可以将大于MTU的UDP包分成较小的包.这样你应该能够发送最高达65535的udp-packages.

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

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

此更改将无法在重新启动后继续存在

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

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有