Предел исходит из переменной 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.