Получить количество байтов, доступных в сокете "recv" с "MSG PEEK" в C++

C++ имеет следующую функцию для получения байтов из сокета, он может проверить количество байтов, доступных с MSG_PEEK флаг. С MSG_PEEK, возвращаемое значение "recv" - это количество байтов, доступных в socket:

#include <sys/socket.h>
ssize_t recv(int socket, void *buffer, size_t length, int flags); 

мне нужно получить количество байтов, доступных в сокете, не создавая buffer (без выделения памяти для buffer). Возможно ли это и как?

2 ответов


вы ищете is ioctl(fd,FIONREAD,&bytes_available), а под windows ioctlsocket(socket,FIONREAD,&bytes_available).

будьте осторожны, хотя ОС не обязательно гарантирует, сколько данных он будет буферизировать для вас, поэтому, если вы ждете очень много данных, вам будет лучше читать в данных, как он приходит, и хранить его в своем собственном буфере, пока у вас есть все, что вам нужно обработать что-то.

чтобы сделать это, что обычно делается, вы просто читаете куски за раз, такие как as

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.


В Windows вы можете использовать ioctlsocket()