以下代码将导致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的广播限制?
答案 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()
无法以原子方式发送消息,并拒绝为您分割。如果您需要发送超过该数量的数据,则必须自行拆分。