gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:37:06 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com