c web服务器客户端响应被read()截断



我在一个C web服务器上工作,当我向服务器发送post请求时,只有一部分post响应被传递到服务器,其余的都丢失了。我确信问题不在于缓冲区大小。可能是因为数据没有及时发送,但我不知道。以下是在服务器上接收数据的代码:

while ((readSock = read(acceptSock, recvLine, sizeof(recvLine))) > 0) {
if (readSock < 0) {
printf("readSock errorn");
memset(fileDir, 0, 255);
memset(recvLineGET1, 0, 70);
memset(httpResponseReport, 0, 1000);
memset(recvLineGET, 0, 60);
memset(fileLine, 0, 1);
memset(httpResponse, 0, 1000);
close(acceptSock);
return NULL;
}
fprintf(stdout, "%s", recvLine);
if ((endOfPost = strstr(recvLine, "rnrn")) != NULL) {
splitPost = strtok(endOfPost, "&");

while (splitPost != NULL) {
printf("%sn", splitPost);
splitPost = strtok(NULL, "&");
}
printf("newline detectedn");
break;
} else if (readSock <= 0 && endOfPost == NULL) {
perror("endOfHttpBody error");
memset(fileDir, 0, 255);
memset(recvLineGET1, 0, 70);
memset(httpResponseReport, 0, 1000);
memset(recvLineGET, 0, 60);
memset(fileLine, 0, 1);
memset(httpResponse, 0, 1000);
close(acceptSock);
return NULL;
}
memset(recvLine, 0, 10);
}
memset(recvLine, 0, 10);

您不能依赖这样一个事实,即用一个"足够大";缓冲区大小实际上将在一次触发中读取所有响应。您必须在循环中调用read((,直到得到所有响应。TCP套接字上的read((调用不能保证您将读取多少数据。您正在获得一个数据流,系统将以字节流的形式向您提供数据,但您无法控制它们是如何打包在一起的。(这取决于很多事情,在内核的网络堆栈深处,所以你不能真的假设任何事情(。唯一正确的方法是循环读取((,直到没有更多的数据可读取为止。这取决于您编写处理代码的方式,它可以处理不能在一个read((调用中获得所有数据的问题。read((返回已读取的字节数,因此您可以通过缓冲区指针+到目前为止已经读取的字节数来轻松地再次调用read(。您仍然需要进行一些检查,以确保在某个时刻返回的数据较大时不会超过缓冲区的界限。

最新更新