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