【问题标题】:fread stalls on socket but fget doesnt?fread 在套接字上停顿,但 get 没有?
【发布时间】:2012-12-23 05:56:47
【问题描述】:

我正在使用 c 中的代理服务器。我已经在不同的地方使用 fread 和 fgets 的组合,但我想调和并理解其中的区别。在以下示例中,我尝试在之前成功使用 fget 的地方使用 fread。相反,我的服务器现在挂在 fread 线上。有什么区别?为什么我的程序会挂起?

void HandleTCPClient(int clntSocket)
{
    FILE *request = fdopen(clntSocket, "r");
    char reader[2000];
    size_t q; //typo before
    while((q=fread(reader, 1, sizeof(reader), request))>0) {  //hangs here!
        printf("i read something!\n");
    }
    return;
}

谢谢!!

编辑:所以,如果我将这一行设为“while((q=fread(reader, 1, 1, request))>0) {"

我的屏幕上到处都是“我读了一些东西”……

不确定这是什么意思。那么,如果流中至少没有缓冲区大小的字符数,那么 fread 实际上什么都不做是正确的吗?

【问题讨论】:

  • size_t q;抱歉.. 类型转换为堆栈

标签: c sockets proxy


【解决方案1】:

fgets 在读取换行符时返回,而fread 将阻塞,直到流中或 EOF 上请求的字节数可用。在您的情况下,调用阻塞是因为您没有在流中准备好 2000 字节的数据。

【讨论】:

  • 这一定是它。你先生是冠军。将立即检查
  • 请记住,一旦到达 EOF,fread 就会返回(文件结尾)
  • 解决这个问题的首选方法是什么...我应该使用 1 字节缓冲区吗?
  • 我知道 EOF 会导致返回...但我的 http 请求不会包含该内容,对吗?
  • @MattDean:这取决于你想做什么。如果您想一次读取一个字符,只需使用getc 而不是 fread。
【解决方案2】:

使用fread() 而不是recv() 在 TCP 套接字上读取对我来说似乎很奇怪..?

无论如何,只要没有可读取的内容,fread 就会阻塞。您应该始终检查套接字是否已准备好执行读取或写入,例如在 linux 上使用 select()

【讨论】:

  • 为什么你觉得这很奇怪? stdio 的目的是缓冲数据以供零碎阅读,所以如果这是你想要的,为什么不使用它呢?
  • 同意,将套接字包装为文件很不错,这样您就可以使用 fread 之类的老板功能。.除非您显然不喜欢我不能哈哈
猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多