C ++具有以下功能,以接收从插座字节,它可以检查可用与字节数MSG_PEEK
标志。 随着MSG_PEEK
“的recv”的返回值的插座可用的字节数:
#include <sys/socket.h>
ssize_t recv(int socket, void *buffer, size_t length, int flags);
我需要在插座可用的字节数,而无需创建buffer
(不分配内存buffer
)。 是否可能,如何?
C ++具有以下功能,以接收从插座字节,它可以检查可用与字节数MSG_PEEK
标志。 随着MSG_PEEK
“的recv”的返回值的插座可用的字节数:
#include <sys/socket.h>
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);
如果你不想坐在那里等待数据,你应该考虑select
或epoll
,以确定数据何时准备好被读取或者没有了, O_NONBLOCK
,如果你想确保你从来块插座标志是非常方便的在recv的。
在Windows中,你可以使用ioctlsocket()
函数与FIONREAD
标志问插座多少字节可用而不需要读取/偷看实际字节本身。 返回的值是一个字节的最小数量recv()
可以不受阻塞返回。 到时候你实际调用recv()
多个字节可能已经到来。