Как работает буферизация в сокете на Linux

Как буферизация работает с сокетами в Linux? т.е. если сервер не читает сокет, а клиент продолжает отправлять данные. Так что же будет? Насколько большой буфер сокета? И узнает ли клиент, чтобы он прекратил отправку?

3 ответа

Решение

Для UDP-сокета клиент никогда не узнает - серверная сторона просто начнет отбрасывать пакеты после заполнения буфера приема.

TCP, с другой стороны, реализует управление потоком. Ядро сервера будет постепенно уменьшать окно, поэтому клиент сможет отправлять все меньше и меньше данных. В какой-то момент окно опустится до нуля. В этот момент клиент заполняет свой буфер отправки и получает ошибку от send(2),

TCP-сокеты используют буферизацию в стеке протоколов. Сам стек реализует управление потоком, поэтому, если буфер сервера заполнен, он не позволит стеку клиента отправлять больше данных. Ваш код будет видеть это как заблокированный вызов send(), Размер буфера может широко варьироваться от нескольких кБ до нескольких МБ.

Я предполагаю, что вы используете send() а также recv() для связи клиента и сервера.

Так, send() вернет количество байтов, которые были отправлены. Это не обязательно равно количеству байтов, которые вы хотели отправить, поэтому вы должны понять это и отправить остальные.

Теперь recv() возвращает количество байтов, считанных в буфер. Так что, если recv возвращает 0, то сервер, вероятно, закрыл соединение.

Другие вопросы по тегам