您要找的是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
来确定数据是否准备好被读取,如果你想确保你永远不会阻塞recv,那么socket的O_NONBLOCK
标志非常方便。
传入的数据套接字应该是“正在进行的字节流”或“一系列TCP包”? – jondinham
查看最大字节数(可以通过程序处理)会让我觉得双重工作,因为当我们实际处理数据时,我们第二次读取 – jondinham
正确,这就是为什么第一种方法更可取,尽管除非你以Gbps的速度运行,那么你永远不会注意到它.. – hexist