Как работает буферизация в сокете на Linux - PullRequest
3 голосов
/ 12 апреля 2010

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

Ответы [ 3 ]

4 голосов
/ 12 апреля 2010

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

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

1 голос
/ 12 апреля 2010

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

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

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

1 голос
/ 12 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...