Как работает буферизация в сокете на Linux
Как буферизация работает с сокетами в Linux? т.е. если сервер не читает сокет, а клиент продолжает отправлять данные. Так что же будет? Насколько большой буфер сокета? И узнает ли клиент, чтобы он прекратил отправку?
3 ответа
Для UDP-сокета клиент никогда не узнает - серверная сторона просто начнет отбрасывать пакеты после заполнения буфера приема.
TCP, с другой стороны, реализует управление потоком. Ядро сервера будет постепенно уменьшать окно, поэтому клиент сможет отправлять все меньше и меньше данных. В какой-то момент окно опустится до нуля. В этот момент клиент заполняет свой буфер отправки и получает ошибку от send(2)
,
TCP-сокеты используют буферизацию в стеке протоколов. Сам стек реализует управление потоком, поэтому, если буфер сервера заполнен, он не позволит стеку клиента отправлять больше данных. Ваш код будет видеть это как заблокированный вызов send()
, Размер буфера может широко варьироваться от нескольких кБ до нескольких МБ.
Я предполагаю, что вы используете send()
а также recv()
для связи клиента и сервера.
Так, send()
вернет количество байтов, которые были отправлены. Это не обязательно равно количеству байтов, которые вы хотели отправить, поэтому вы должны понять это и отправить остальные.
Теперь recv()
возвращает количество байтов, считанных в буфер. Так что, если recv возвращает 0, то сервер, вероятно, закрыл соединение.