jon*_*ham 13 c sockets buffer recv peek
C++具有以下函数来从套接字接收字节,它可以检查MSG_PEEK标志可用的字节数.使用MSG_PEEK,'recv'的返回值是socket中可用的字节数:
#include <sys/socket.h>
ssize_t recv(int socket, void *buffer, size_t length, int flags);
Run Code Online (Sandbox Code Playgroud)
我需要在不创建的buffer情况下获取套接字中可用的字节数(不分配内存buffer).有可能吗?怎么样?
hex*_*ist 32
你正在寻找的是ioctl(fd,FIONREAD,&bytes_available),在windows下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);
Run Code Online (Sandbox Code Playgroud)
如果您不想坐在那里等待数据,您应该查看select或epoll确定何时可以读取数据,O_NONBLOCK如果您想确保永远不会阻止数据,那么套接字的标志非常方便.