在C ++中使用’recg’和’MSG_PEEK’获取套接字中可用的字节数

C ++具有以下函数来从套接字接收字节,它可以检查MSG_PEEK标志可用的字节数。 使用MSG_PEEK ,’recv’的返回值是socket中可用的字节数:

 #include  ssize_t recv(int socket, void *buffer, size_t length, int flags); 

我需要在不创建buffer情况下获取套接字中可用的字节数(不为buffer分配内存)。 有可能吗?怎么样?

你正在寻找的是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); 

如果您不想坐在那里等待数据,您应该查看selectepoll以确定何时可以读取数据,如果您想确保永不阻止,则套接字的O_NONBLOCK标志非常方便在recv。

在Windows上,您可以使用带有FIONREAD标志的ioctlsocket()函数来询问套接字可用的字节数,而无需读取/查看实际字节本身。 返回的值是recv()可以无阻塞地返回的最小字节数。 当你实际调用recv() ,可能会有更多字节到达。