c - 在C++中通过 'recv'和 'MSG_PEEK'获取套接字中可用的字节数

标签 c sockets buffer recv peek

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);

如果你不想坐在那里等待数据,你应该查看 selectepoll 来确定数据何时准备好被读取,如果你想确保你永远不会在 recv 上阻塞,那么套接字的 O_NONBLOCK 标志非常方便。

关于c - 在C++中通过 'recv'和 'MSG_PEEK'获取套接字中可用的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12984816/

相关文章:

sockets - 在openSUSE中工作的套接字在Debian中不工作吗?

image - OpenCL 中的图像和缓冲区有什么区别?

java Bufferreader退出

Javascript/Jquery Blob 不显示 Chrome PDF

c - C程序不执行main之外的函数

javascript - 如何为常量创建 JavaScript 和 C/C++ 之间的通用文件?

c# & java 套接字和字节数据读取开销

c# - 使用 .net 监控传入/传出的 http 流量

c - 如何使用 POSIX 上的线程生成 [0,1] 之间的随机数

c - 我尝试创建以相反顺序显示其给定参数的代码,但为什么它的代码告诉我段错误?