首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UDP消息太长

UDP消息太长
EN

Stack Overflow用户
提问于 2014-04-03 01:52:34
回答 2查看 16.8K关注 0票数 9

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

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

代码语言:javascript
复制
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))

我得到了一个错误

代码语言:javascript
复制
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。当我在客户端执行字节大小检查时

代码语言:javascript
复制
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)))

我得到了

代码语言:javascript
复制
Received 9253 bytes of data.

我不明白为什么当我发送9216字节(这是以字节为单位的字符串长度)时,它的长度是9253字节。28个字节是UDP报头,但其余9个字节中存储的内容是什么?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-11 17:18:56

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

但是,计算机可以将大于MTU的UDP包分段为较小的包。这样,您应该能够发送高达65535的udp包。

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

代码语言:javascript
复制
    sudo sysctl -w net.inet.udp.maxdgram=65535

此更改将在重新启动后失效。

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

票数 25
EN

Stack Overflow用户

发布于 2014-04-03 02:19:38

65535字节是相当长的数据帧,几乎没有网卡支持它。现在大多数千兆以太网卡的MTU都是9k字节以上的标准容量。

出现额外字节的可能原因:

1)网卡可以添加到数据包末尾的零填充

2)统计L2头

您可以安装Wireshark并查看您发送和接收的内容。使用此工具是了解问题所在的好方法

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22819214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档