插座上的fread停转但fget没有?

Mat*_*ean 5 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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!!

编辑:所以,如果我使行"while((q = fread(读者,1,1,请求))> 0){"

我在屏幕上看到"我读了些东西"......

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

per*_*eal 4

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