OS X UDP广播最大数据包大小

3
以下代码在我的Macbook上(运行OS X 10.10.5)会导致错误:error: [Errno 40] Message too long
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

sock.sendto('a'*1473, ('<broadcast>', 9999))

当消息长度为1473或更长时,我会收到error: [Errno 40] Message too long的错误提示。

但是,如果我将'<broadcast>'更改为'localhost'或任何非广播IP,则长度超过1472的消息可以正常传输。

我在Ubuntu和CentOS上进行了相同的实验。在这两台机器上,我都没有收到error: [Errno 40] Message too long的错误消息。

两个问题:
为什么OS X会表现出这种行为?
是否有可能增加OS X的广播限制?


可能你的网卡的最大传输单元(MTU)是1500,在考虑了头部和其他信息后,只允许UDP消息有效载荷为1473。UDP不会为你拆分消息。另一方面,你的环回接口通常具有更高的MTU(在我的Linux系统上为64k)。 - undefined
@twalberg 嗯,如果我将'<broadcast>'更改为任何其他IP地址,它就可以正常工作。还有其他想法吗? - undefined
@Stephen,你能找到解决办法吗? - undefined
@ShaunBudhram 没错,这个方法起作用了:sudo sysctl -w net.inet.udp.maxdgram=65535 - undefined
很遗憾,这在我的Mac上没有起作用 - 这个值被设置为65535,但仍然出现错误。 - undefined
1个回答

0

man socketSOCK_DGRAM有以下解释:

SOCK_DGRAM      Supports datagrams (connectionless, unreliable messages of a fixed maximum length).

根据套接字的其他参数(回环与实际网络路径、广播与单播等),这个“固定的最大长度”可能会有所不同,但它仍然是一个“固定的最大长度”。
在 "man sendto" 的错误部分中列出了这个内容。
EMSGSIZE The socket type requires that message be sent atomically, and the size of the message to be sent made this  impossible.

这基本上对应于你所看到的情况 - 有一个“固定的最大长度”,超过这个长度sendto()无法原子地发送消息,并拒绝为你分割它。如果你需要发送超过这个数据量的数据,你就必须自己进行分割。

这实际上并没有回答我提出的问题:为什么OSX有这个限制而其他操作系统没有?是否可以更改这个限制?为什么只在发送到广播地址时出现这种情况? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接