sockets上的fread停止但fget没有?

我正在使用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将无法正常执行任何操作是正确的吗?

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

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

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