如何在fread()中禁用缓冲?

Ank*_*rVj 6 c sockets buffering fread

我正在使用fread()和fwrite()读取和写入套接字.我认为这些功能用于缓冲输入和输出.有没有什么方法可以在使用这些功能的同时禁用缓冲?

编辑:

我正在构建一个远程桌面应用程序,远程客户端似乎"落后于服务器",我不知道可能是什么原因......我认为这可能是因为缓冲读写.但使用setvbuf没有用.

通过"滞后",我的意思是远程桌面客户端在服务器后面运行几秒钟.服务器在特定时刻所做的事情在延迟大约15-20秒后反映在客户端.

另外,我不想使用not-use-fread(),因为它是现有代码的一部分.我不想修改它.我最终可以使用write()和read(),但我想避免它.

cni*_*tar 8

您可以使用setvbuf禁用特定文件指针的缓冲:

setvbuf(fp, NULL, _IONBF, 0);
Run Code Online (Sandbox Code Playgroud)

编辑

正如史蒂文斯所警告的那样,将标准输入的插座混合起来有点棘手.这里有一些引用.

后三个函数[fseek,fsetpos,rewing]的问题在于它们都调用lseek,它在套接字上失败.

处理此读写问题的最简单方法是为给定套接字打开两个标准I/O流:一个用于读取,一个用于写入.

解决此[缓冲问题]的一种方法是通过调用setvbuf强制输出流进行行缓冲.另一种方法是在每次调用fputs后通过调用fflush强制输出每个回显线.但实际上,这些解决方案中的任何一个仍然容易出错,并且可能与Nagle算法交互不良


结论:

尽量停止使用stdio.使用stdiofread和没有任何意义fwrite.直接使用readwrite不是.史蒂文斯谈到"线路缓冲"输出,因为人们使用fgetsfputs使用stdio