Какое максимальное значение для получения / восстановления - PullRequest
1 голос
/ 17 июня 2020

Когда я слушаю сокет TCP или UDP с помощью

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

или

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flag , struct sockaddr *src_addr, socklen_t *addrlen);

Имеется аргумент, называемый len

В linux, какова максимальная длина буфера, которую я могу прочитать с помощью этой функции? Это 65336? Где это определяет?

Что будет, если в сокете будет больше байтов, чем это число? Они будут выпадать? Или прочту их в следующем l oop?

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Поскольку len относится к типу size_t, его максимальный размер определяется как SIZE_MAX. Стандарт C определяет, что SIZE_MAX должен быть не менее 65535. Однако верхняя граница отсутствует, поэтому его фактическое значение зависит от компилятора.

size_t и SIZE_MAX определены в <stdint.h> .

Что произойдет, если будет больше байтов, чем указано len, зависит от типа сокета.

Если у вас есть сокет TCP (типа SOCK_STREAM), если ожидающих чтения байтов больше, чем значение len, они будут прочитаны при следующем вызове recv().

Однако, если ваш сокет имеет тип SOCK_DGRAM ( UDP socket) вызов recvfrom() всегда будет читать всю дейтаграмму. Если длина дейтаграммы превышает len, первые len байта будут считаны в ваш буфер, а остальные будут потеряны.

В этом случае recvfrom() возвращает -1 и устанавливает errno равным EMSGSIZE, вот как вы проверяете, произошло ли это.

0 голосов
/ 17 июня 2020

Теоретически вы можете читать буфер сколь угодно большого размера. Максимальное значение size_t гарантировано стандартом C как минимум 65535, однако в современных системах Linux оно будет как минимум 2 32 -1, если не 2 . 64 -1.

Для TCP, поскольку это протокол потоковой передачи, любые байты, оставшиеся непрочитанными, останутся в буфере, ожидая чтения на следующей итерации.

Для UDP одновременно считывается только одна полная дейтаграмма, и если буфер недостаточно велик для хранения дейтаграммы, любые лишние байты теряются. Кроме того, поскольку протокол UDP не обладает надежностью, дейтаграммы могут быть потеряны, если не будут прочитаны достаточно быстро.

...