Для сокета SOCK_STREAM
размер буфера на самом деле не имеет значения, потому что вы просто извлекаете несколько ожидающих байтов и можете получить больше при следующем вызове. Просто выберите любой размер буфера, который вы можете себе позволить.
Для сокета SOCK_DGRAM
вы получите подходящую часть ожидающего сообщения, а остальные будут отброшены. Вы можете получить ожидающий размер датаграммы с помощью следующего ioctl:
#include <sys/ioctl.h>
int size;
ioctl(sockfd, FIONREAD, &size);
В качестве альтернативы вы можете использовать MSG_PEEK
и MSG_TRUNC
флаги вызова recv()
для получения ожидаемого размера дейтаграммы.
ssize_t size = recv(sockfd, buf, len, MSG_PEEK | MSG_TRUNC);
Вам нужно MSG_PEEK
, чтобы просмотреть (не получить) ожидающее сообщение - recv возвращает реальный, а не усеченный размер; и вам нужно MSG_TRUNC
, чтобы не переполнять текущий буфер.
Тогда вы можете просто malloc(size)
реальный буфер и recv()
дейтаграмма.