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)
。
不过请注意,操作系统不一定保证它会为您缓冲多少数据,因此如果您正在等待大量数据,您最好在数据进入时读取并将其存储在你自己的缓冲区,直到你拥有处理某些东西所需的一切。
要做到这一点,通常要做的是一次读取 block ,例如
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
来确定数据何时准备好被读取,如果你想确保你永远不会在 recv 上阻塞,那么套接字的 O_NONBLOCK
标志非常方便。
关于c - 在C++中通过 'recv'和 'MSG_PEEK'获取套接字中可用的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12984816/