Ответ 1
Вы ищете ioctl(fd,FIONREAD,&bytes_available)
и под окнами ioctlsocket(socket,FIONREAD,&bytes_available)
.
Будем предупреждать, однако, ОС не обязательно гарантирует, сколько данных он будет буферизировать для вас, поэтому, если вы ждёте очень много данных, вам будет лучше читать данные по мере их поступления и хранения в ваш собственный буфер, пока у вас не будет всего необходимого для обработки чего-либо.
Для этого обычно делается то, что вы просто читаете куски за раз, например
char buf[4096];
ssize_t bytes_read;
do {
bytes_read = recv(socket, buf, sizeof(buf), 0);
if (bytes_read > 0) {
/* do something with buf, such as append it to a larger buffer or
* process it */
}
} while (bytes_read > 0);
И если вы не хотите сидеть там, ожидая данных, вы должны изучить select
или epoll
, чтобы определить, когда данные готовы к чтению или нет, а флаг O_NONBLOCK
для сокетов очень если вы хотите, чтобы вы никогда не блокировали recv.