узнать максимальный размер сообщения AF_UNIX + SOCK_SEQPACKET - PullRequest
4 голосов
/ 14 октября 2011

Hy, интересно, есть ли возможность узнать максимальную длину SEQPACKET, кроме экспериментальной (а-ля для (i = 0; i <100 ... 00; i ++) send (...))). </p>

И второй вопрос:

Если я получил сообщение об ошибке == EMSGSIZE при попытке отправить AF_UNIX SEQPACKET, гарантируется ли это из-за максимального размера сообщения или могут быть другие причины?

Извините за мой английский.

1 Ответ

5 голосов
/ 22 ноября 2011

Предел исходит из переменной sysctl_wmem_default. Это можно просмотреть в файловой системе proc: /proc/sys/net/core/wmem_max

В этом случае разные версии Linux могут иметь разную реализацию. Но для доменных сокетов UNIX есть такой код:

sk->sk_sndbuf = sysctl_wmem_default;

и

err = -EMSGSIZE;
if (len > sk->sk_sndbuf - 32)
    goto out;

Таким образом, фактический предел: значение / proc / sys / net / core / wmem_max минус 32 . Я не знаю, насколько сильно меняется это магическое число между версиями. Значение / proc / sys / net / core / wmem_max может меняться в зависимости от доступных страниц оперативной памяти.

В моем окне linux значение 105472. И максимальный размер дейтаграммы (при использовании AF_UNIX и SOCK_DGRAM) составляет 105440. Если я попытаюсь отправить сообщение с размером 105441, произойдет сбой с EMSGSIZE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...