如何在C和Linux中检查套接字可用的数据量

Jim*_*imm 30 c sockets linux

我有一台服务器接收连续的数据流.与从套接字多次读取相反,我想通过一次系统调用来读取套接字接收缓冲区中的整个数据read().

当然,我可以传递一个大缓冲区,read()并尝试用所有可用数据填充它.但这会浪费大量内存,因为malloc的缓冲区大多数时候都比socket上的实际数据大.有没有办法查询套接字上的可用数据?

fiz*_*zer 52

是:

#include <sys/ioctl.h>

...

int count;
ioctl(fd, FIONREAD, &count);
Run Code Online (Sandbox Code Playgroud)

  • TCP层没有"消息"这样的东西,只是一个字节流.您的申请负责强加任何其他结构. (4认同)
  • 这是便携式吗?这是BSD套接字的一部分吗? (2认同)

Gre*_*ill 6

不,那里没有。即使有办法做到这一点,您得到的任何答案都将立即过时(因为新数据可能随时到达)。

请注意,当您将缓冲区传递给 时,当有任意数量的数据要读取(至少一个字节)时,read()该函数将返回,而不是等待缓冲区完全填满。

  • @Jimm:我在想 L1(“几千字节”),但原则适用于一般情况。即使您所做的只是填充一个大的内存缓冲区,通过小读操作也不会变慢,因为您可以继续覆盖 L1 缓存中的数据(读入小缓冲区,复制到其他地方,再次读入同一个小缓冲区)等)但是你可能会对数据做一些事情,我的观点是,你最好在小块(缓存中的新鲜数据)上做一些事情,而不是在大块(陈旧的,需要从 RAM 中获取)上做一些事情。 。TLB 未命中惩罚也有利于小缓冲区。 (2认同)