Накапливаются ли полученные данные в сокете?

Рейтинг: 1Ответов: 2Опубликовано: 23.11.2014

Накапливаются ли где-то данные до вызова recv()? То есть если это сервер и после успешной установки соединения клиент шлет ему данные, но сервер не сразу вызывает recv(), а с определенной задержкой, то какие данные получит в итоге буфер, указанный в аргументах recv()? Последовательно все данные получит? Или только те, которые в момент запуска recv() пришли? Если все, значит есть какой-то буфер в операционной системе? Тогда какой его размер и как долго там хранятся данные ожидая вызова recv()?

Ответы

▲ 3Принят

@xinakapu, уточните, Вы говорите о tcp (SOCK_STREAM) или udp (SOCK_DGRAM).

В любом случает первые пришедшие хранятся. В случае tcp все "склеивается" в один поток. При заполнении системного буфера (для простоты назовем эту структуру ядра так) прием прекращается (отправитель тормозится).

Для udp пришедшие данные хранятся в виде полученных "пакетов" (datagram) c соблюдением границ. Не помещающиеся в буфер отбрасываются без уведомления отправителя (и получателя). При recv() читается один пакет за один вызов (первые байты, помещающиеся в буфер recv).

▲ 2

Данные склеиваются. Принимающая сторона получит всё одним куском. Максимальный размер этого куска не может превышать размер буфера сокета.