首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (确定)

net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (确定)
EN

Stack Overflow用户
提问于 2021-07-13 09:25:33
回答 1查看 1.6K关注 0票数 1

我在网络方面是新手,我试着在C上写我的第一个http服务器,但是我遇到了一个问题。当我尝试按块发送图像时,我增加了一个错误GET http://localhost/img.jpg net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK),当html运行良好时。void answerOnGet(int socketCopy,char *fileName) { struct;

代码语言:javascript
运行
复制
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);

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-13 10:03:39

你的错误很可能是

代码语言:javascript
运行
复制
if(write(socketCopy, buf, strlen(buf)) < 0)

strlen(buf)是做什么的?它计算到前一个0字节的字节数。

这是要写入的正确字节数吗?只有当结尾有一个0字节,而在此之前没有。

在那里吗?嗯,不是。文件可以在中间有0字节,而fread没有在末尾放置一个字节。

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

其他bug:

正如@rveerd所指出的,

  • 可能调用write,内核只编写部分数据。如果发生这种情况,您仍然必须再次调用它来编写其余的数据。这可能会发生多次,所以您需要一个循环。我建议创建一个函数actually_write来执行循环,然后您可以调用actually_write

  • 您的程序有时不会发送一些字节。例如,如果文件长度为1001字节,则执行20字节块,在最后一个完整块之后仍然有一个字节,fread返回1,但不发送额外的字节.
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68359781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档