OS X UDP广播最大包大小

时间:2015-10-23 17:46:57

标签: python macos udp

以下代码将导致error: [Errno 40] Message too long 在我的Macbook上(运行OS X 10.10.5)

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的广播限制?

1 个答案:

答案 0 :(得分:0)

man socket可以说SOCK_DGRAM

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

根据套接字的其他参数(环回与实际网络路径,广播与单播等),“固定最大长度”实际上可能不同,但它仍然是“固定的最大长度”。

man sendto在ERRORS部分列出了这个:

EMSGSIZE The socket type requires that message be sent atomically, and the size of the message to be sent made this  impossible.

这几乎与您所看到的相对应 - 有一个“固定的最大长度”,sendto()无法以原子方式发送消息,并拒绝为您分割。如果您需要发送超过该数量的数据,则必须自行拆分。