5

我正在使用 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 实际上什么都不做是否正确?

4

2 回答 2

4

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

于 2012-12-23T06:01:47.973 回答
0

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

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

于 2012-12-23T06:05:09.267 回答