获取关于C中插座可用的字节由“的recv”与“MSG_PEEK”的数量++(Get the numb

2019-07-01 10:19发布

C ++具有以下功能,以接收从插座字节,它可以检查可用与字节数MSG_PEEK标志。 随着MSG_PEEK “的recv”的返回值的插座可用的字节数:

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

我需要在插座可用的字节数,而无需创建buffer (不分配内存buffer )。 是否可能,如何?

Answer 1:

你要找的是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的。



Answer 2:

在Windows中,你可以使用ioctlsocket()函数与FIONREAD标志问插座多少字节可用而不需要读取/偷看实际字节本身。 返回的值是一个字节的最小数量recv()可以不受阻塞返回。 到时候你实际调用recv()多个字节可能已经到来。



文章来源: Get the number of bytes available in socket by 'recv' with 'MSG_PEEK' in C++