net::ERR_INCOMPLETE_CHUNKED_ENCODING 200(好)
net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)
我是网络新手,我尝试在 C 上编写我的第一个 http 服务器。但是我遇到了一个问题。当我尝试按块发送图像时,我收到错误 GET http://localhost/img.jpg net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK),whith html 它工作正常。
void answerOnGet(int socketCopy, char *fileName)
{
结构统计 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 error\n");
exit(1);
}
FILE *fd = fopen(filePath, "rb");
if(fd == NULL)
{
perror("Opening error");
exit(1);
}
snprintf(responseHeader, sizeof(responseHeader),
"HTTP/1.1 200 OK\r\n"
"Transfer-Encoding: chunked\r\n"
"Content-type: %s\r\n\r\n", 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 = %ld\n", sizeOfChunk);
char amountOfBytes[SIZE];
while(fread(buf, sizeof(char), sizeOfChunk, fd) == (sizeOfChunk))
{
sprintf(amountOfBytes, "%lX\r\n", sizeOfChunk);
puts("\nStart to write");
if(write(socketCopy, amountOfBytes, strlen(amountOfBytes)) < 0)
{
perror("Write bytes error");
exit(1);
}
strcat(buf, "\r\n");
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, "0\r\n\r\n", strlen("0\r\n\r\n")) < 0)
{
perror("Write zero chunk error");
exit(1);
}
fclose(fd);
free(buf);
}
你的错误很有可能
if(write(socketCopy, buf, strlen(buf)) < 0)
strlen(buf)
是做什么的?它计算字节数直到第一个 0 字节。
这是要写入的正确字节数吗?仅当末尾有一个 0 字节且之前有 none。
在那儿?好吧,不。文件中间可以有 0 个字节,fread 不会在末尾放一个字节。
您应该使用 sizeOfChunk 而不是 strlen(buf)。
其他错误:
正如@rveerd 指出的那样,您调用 write
并且内核可能只写入部分数据。如果发生这种情况,您仍然必须再次调用它来写入其余数据。这可能会发生多次,因此您需要一个循环。我建议制作一个函数 actually_write
来执行循环,然后你可以调用 actually_write(socketCopy, buf, sizeOfChunk)
您的程序有时不会在末尾发送某些字节。如果文件是,例如,1001 字节长,那么你做 20 字节的块,在最后一个完整的块之后还有一个字节,并且 fread
returns 1 但是你不发送额外的字节。
我是网络新手,我尝试在 C 上编写我的第一个 http 服务器。但是我遇到了一个问题。当我尝试按块发送图像时,我收到错误 GET http://localhost/img.jpg net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK),whith html 它工作正常。 void answerOnGet(int socketCopy, char *fileName) { 结构统计 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 error\n");
exit(1);
}
FILE *fd = fopen(filePath, "rb");
if(fd == NULL)
{
perror("Opening error");
exit(1);
}
snprintf(responseHeader, sizeof(responseHeader),
"HTTP/1.1 200 OK\r\n"
"Transfer-Encoding: chunked\r\n"
"Content-type: %s\r\n\r\n", 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 = %ld\n", sizeOfChunk);
char amountOfBytes[SIZE];
while(fread(buf, sizeof(char), sizeOfChunk, fd) == (sizeOfChunk))
{
sprintf(amountOfBytes, "%lX\r\n", sizeOfChunk);
puts("\nStart to write");
if(write(socketCopy, amountOfBytes, strlen(amountOfBytes)) < 0)
{
perror("Write bytes error");
exit(1);
}
strcat(buf, "\r\n");
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, "0\r\n\r\n", strlen("0\r\n\r\n")) < 0)
{
perror("Write zero chunk error");
exit(1);
}
fclose(fd);
free(buf);
}
你的错误很有可能
if(write(socketCopy, buf, strlen(buf)) < 0)
strlen(buf)
是做什么的?它计算字节数直到第一个 0 字节。
这是要写入的正确字节数吗?仅当末尾有一个 0 字节且之前有 none。
在那儿?好吧,不。文件中间可以有 0 个字节,fread 不会在末尾放一个字节。
您应该使用 sizeOfChunk 而不是 strlen(buf)。
其他错误:
正如@rveerd 指出的那样,您调用
write
并且内核可能只写入部分数据。如果发生这种情况,您仍然必须再次调用它来写入其余数据。这可能会发生多次,因此您需要一个循环。我建议制作一个函数actually_write
来执行循环,然后你可以调用actually_write(socketCopy, buf, sizeOfChunk)
您的程序有时不会在末尾发送某些字节。如果文件是,例如,1001 字节长,那么你做 20 字节的块,在最后一个完整的块之后还有一个字节,并且
fread
returns 1 但是你不发送额外的字节。