我正在使用fread()和fwrite()读取和写入套接字。我认为这些功能用于缓冲输入和输出。有没有什么方法可以在使用这些功能的同时禁用缓冲?
编辑:
我正在构建一个远程桌面应用程序,远程客户端似乎落后于服务器",我不知道可能是什么原因...我认为它可能是因为缓冲读写..但使用setvbuf无效。
由于"滞后",我的意思是远程桌面客户端在服务器后面运行几秒钟。服务器在特定时刻所做的事情在延迟大约15-20秒后反映在客户端。
另外,我不想不使用-fread(),因为它是现有代码的一部分。我不想修改它。我最终可以使用write()和read(),但我想避免它。
答案 0 :(得分:8)
您可以使用setvbuf
禁用特定文件指针的缓冲:
setvbuf(fp, NULL, _IONBF, 0);
后三个函数[fseek,fsetpos,rewing]的问题就在于此 他们都叫lseek,它在套接字上失败了。
处理此读写问题的最简单方法是打开两个 给定套接字的标准I / O流:一个用于读取,一个用于 写
解决此[缓冲问题]的一种方法是强制输出流 通过调用setvbuf进行行缓冲。另一个是强迫每个人 每次调用fputs后,通过调用fflush输出回显的行。 但在实践中,这些解决方案中的任何一个仍然容易出错 可能与Nagle算法交互不良
总结:
尝试停止使用stdio
。 使用stdio
和fread
以及fwrite
是没有意义的。请改用read
和write
。史蒂文斯谈到"线缓冲"输出,因为人们使用fgets
和fputs
与stdio
答案 1 :(得分:2)
使用
int setvbuf ( FILE * stream, char * buffer, int mode, size_t size );
mode
Specifies a mode for file buffering:
_IOFBF Full buffering: On output, data is written once the buffer is full. On Input the buffer is filled when an input operation is requested and the buffer is empty.
_IOLBF Line buffering: On output, data is written when a newline character is inserted into the stream or when the buffer is full, whatever happens first. On Input, the buffer is filled up to the next newline character when an input operation is requested and the buffer is empty.
_IONBF No buffering: No buffer is used. Each I/O operation is written as soon as possible. In this case, the buffer and size parameters are ignored.
在stdio.h
答案 2 :(得分:1)
“滞后”是指远程桌面客户端在服务器后面运行几秒钟。服务器在特定时刻所做的事情会在延迟大约15-20秒后反映在客户端。
你需要100%确认两件事。
1)客户端是否被fread
屏蔽了?如果没有,那么它就会滞后,因为它太忙而无法跟上服务器(或者代码被破坏而且愚蠢地没有调用fread
)。在任何一种情况下,缓冲和网络都没有错。
2)客户端从fread
完成的呼叫收到的总字节数是否少于服务器在完成的fwrite
呼叫中发送的总字节数?如果没有,那么它“滞后”,因为它误解了它收到的一些数据(没有意识到它得到了一些实际得到的数据)。在这种情况下,缓冲和网络没有错。
我敢以10比1的赔率打赌你,我上面提到的两件事之一就是这样。
为了澄清案例二,如果不清楚,请考虑这个例子:
1)服务器发送消息。
2)服务器发送消息。
3)客户端调用fread
并获取两条消息但由于代码损坏,只认为它已经获得了一条消息。 (也许破碎的代码假定消息不能“粘在一起”。)
4)此时,客户端看起来似乎“滞后”了一条消息,但实际上,客户端的代码只是破了。客户端已读取服务器已发送的字节数。它不会滞后,只是破碎。
在排除这两个“忙代码”和“破码”类型的情况之前,你不应该假设网络有问题,因为那是最不可能的解释。