Сокеты SOCK_STREAM наверняка сохраняют границы сообщений. Просто поместите каждое сообщение в отдельный поток: создайте новый сокет, подключите его, напишите сообщение, выключите его в направлении отправки, получите ответ и отключитесь. Затем повторите для следующего сообщения. То есть соединения поддерживают кадрирование, поскольку они четко определили сигнализацию «начало потока» и «конец потока»; они просто не поддерживают создание кадров в потоке. Так же, как сокеты SOCK_DGRAM не поддерживают кадрирование внутри дейтаграммы.

тоящее время у меня жесткое ограничение в 130688 байт. Если я пытаюсь отправить что-то большее в одном сообщении, я получаю ошибку ENOBUFS.

Я проверил параметры sysctl net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max и net.unix.max_dgram_qlen и увеличил их все, но они не имеют никакого эффекта, поскольку они имеют дело с общий размер буфера, а не размер сообщения.

Я также установил параметры сокетов SO_SNDBUF и SO_RCVBUF, но это та же проблема, что и выше. Размер буфера сокета по умолчанию устанавливается в зависимости от параметров сокета _default.

Я посмотрел на исходный код ядра, где ENOBUFS возвращается в стеке сокетов, но мне не было ясно, откуда он взялся. Единственные места, которые, по-видимому, возвращают эту ошибку, связаны с невозможностью выделить память.

Максимальный размер на самом деле 130688? Если нет, то можно ли это изменить без перекомпиляции ядра?

Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос