2015-10-23 3 views
2

Следующий код приведет к error: [Errno 40] Message too long на моем MacBook (под управлением ОС X 10.10.5)OS X UDP вещания максимальный размер пакета

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)) 

я получаю error: [Errno 40] Message too long для любого сообщения 1473 или более.

Однако, если я изменю '<broadcast>' на 'localhost' или на любой нерансетированный IP, сообщения длиннее 1472 пройдут через штраф.

Я сделал этот же эксперимент на Ubuntu и CentOS. Я не получаю сообщение error: [Errno 40] Message too long на любой из этих машин.

Два вопроса:
Почему OS X ведет себя так?
Можно ли увеличить лимит вещания на OS X?

+0

Возможно, MTU на вашем сетевом адаптере составляет 1500, который после учета заголовков и т. Д. Разрешает только полезную нагрузку UDP-сообщения 1473. UDP не будет разделять сообщения для вас. С другой стороны, ваш loopback-интерфейс обычно имеет гораздо более высокий MTU (64k на моей Linux-системе). – twalberg

+0

@twalberg hmmm. Если я изменил «» на любой другой IP-адрес, он отлично работает. Любые другие мысли? – Stephen

ответ

0

man socket имеет это сказать о SOCK_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() не может отправить сообщение атомарно, и отказывается разделите его для вас. Если вам нужно отправить больше, чем этот объем данных, вам придется разбить его самостоятельно.

+0

На самом деле это не отвечает на вопросы, которые я задал: Почему OS X имеет этот предел, где нет других ОС? Можно ли изменить лимит? Почему это просто, когда вы отправляете на широковещательный адрес? – Stephen