C语言 net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)



我是网络领域的新手,我试图在C上编写我的第一个http服务器。然而我遇到了一个问题。当我尝试按块发送图像时,我收到一个错误GEThttp://localhost/img.jpgnet::ERR_INCOMPLETE_CHUNKED_ENCODING 200(OK(,html可以正常工作。void answerOnGet(int socketCopy,char*fileName({struct-stat-sbuf;

char filePath[SIZE];
determinateFilePath(fileName, filePath);
stat(filePath, &sbuf);
char responseHeader[2*SIZE];
char fileType[SIZE];
if (strstr(fileName, ".html") || !strcmp(fileName, "/"))
{
strcpy(fileType, "text/html");
}
else if (strstr(fileName, ".jpg"))
{
strcpy(fileType, "image/jpg");
}
else if(strstr(fileName, ".ico"))
{
strcpy(fileType, "image/ico");
}
else
{
fprintf(stderr, "Type errorn");
exit(1);
}
FILE *fd = fopen(filePath, "rb");

if(fd == NULL)
{
perror("Opening error");
exit(1);
}
snprintf(responseHeader, sizeof(responseHeader),
"HTTP/1.1 200 OKrn"
"Transfer-Encoding: chunkedrn"
"Content-type: %srnrn", fileType
);
if(write(socketCopy, responseHeader, strlen(responseHeader)) < 0)
{
perror("Write error");
exit(1);
}
long unsigned sizeOfChunk = 0;
if(sbuf.st_size > SIZE)
{
sizeOfChunk = sbuf.st_size/50;
}
else
{
sizeOfChunk = sbuf.st_size;
}
char *buf = malloc(sizeof(char) * (sizeOfChunk + 2));
printf("Size of chunk = %ldn", sizeOfChunk);
char amountOfBytes[SIZE];
while(fread(buf, sizeof(char), sizeOfChunk, fd) == (sizeOfChunk))
{    


sprintf(amountOfBytes, "%lXrn", sizeOfChunk);
puts("nStart to write");
if(write(socketCopy, amountOfBytes, strlen(amountOfBytes)) < 0)
{
perror("Write bytes error");
exit(1);
}
strcat(buf, "rn");
if(write(socketCopy, buf, strlen(buf)) < 0)
{
perror("Write error");
exit(1);
}
puts("nEnd of write");
bzero(buf, sizeOfChunk);
bzero(amountOfBytes, strlen(amountOfBytes));
}
puts("Send zero chunk");

if(write(socketCopy, "0rnrn", strlen("0rnrn")) < 0)
{
perror("Write zero chunk error");
exit(1);
}
fclose(fd);
free(buf);

}

您的错误很可能是

if(write(socketCopy, buf, strlen(buf)) < 0)

strlen(buf)做什么?它统计字节数,直到第一个0字节
这是要写入的正确字节数吗?只有当末尾有一个0字节,而在此之前没有
有吗?嗯,不。文件可以在中间有0个字节,fread不会在最后放一个字节。

您应该使用sizeOfChunk而不是strlen(buf(。

其他错误:

  • 正如@rverd所指出的,您可能调用write,而内核只写入部分数据。如果发生这种情况,您仍然需要再次调用它来写入其余的数据。这种情况可能发生多次,因此需要循环。我建议制作一个函数actually_write来完成循环,然后你可以调用actually_write(socketCopy, buf, sizeOfChunk)

  • 您的程序有时不会在末尾发送某些字节。例如,如果文件长度为1001字节,则执行20字节的块,在最后一个完整块之后还有一个字节,fread返回1,但不发送额外的字节。

最新更新