клиент записывает 5 байтов в сокет через каждую 1 секунду.
сервер постоянно читает из сокета. буфер на стороне сервера имеет длину 10 байт. так что функция выглядит так
read(fd, buf, 10);
сервер читает 5 байтов каждый раз.
теперь клиент пишет 5 байтов непрерывно.
сервер такой же. сервер читает 10 байтов каждый раз.
так что чтение в сокете возвращает столько байтов, сколько доступно в буфере.
он не ждет, чтобы заполнить буфер.
это как-то связано с SO_RCVLOWAT.
я читал, что эта опция сокета влияет только на select / poll io.
спасибо
обновление
я изменил SO_RCVLOWAT на 10, теперь он ждет как минимум 10 байтов в приемном буфере. так что, похоже, это как-то связано с отметкой низкого уровня в буфере приема.
но я не могу установить нижний водяной знак на 0. Он всегда устанавливает его на 1 в этом случае. почему так?