插座上的fread停止但得到的却没有?

时间:2012-12-23 05:56:47

标签: c sockets proxy

我正在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(读者,1,1,请求))> 0){”

我在屏幕上看到“我读了一些东西”......

不确定这意味着什么。因此,如果流中至少存在缓冲区大小的字符数,那么fread将无法正常执行任何操作吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

使用fread()代替recv()来读取TCP套接字对我来说很奇怪..?

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