Получить количество байтов, доступных в сокете "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.