You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言编写HTTP服务器分块发送JPG报net::ERR_INCOMPLETE_CHUNKED_ENCODING 200错误

问题根因

  • 错误使用字符串函数处理二进制数据:图片为二进制格式,内容中存在大量\0字符。你代码中用strlen(buf)计算内容长度,会在遇到第一个\0时提前截断,导致实际发送的内容远小于chunk声明的长度;strcat(buf, "\r\n")也会从第一个\0位置追加换行,直接丢弃了\0之后的所有二进制内容。而HTML是纯文本格式,基本不会出现\0,所以刚好能正常运行。
  • 遗漏最后不足chunk大小的剩余内容:while循环判断条件为fread返回值等于sizeOfChunk,如果文件总大小不是sizeOfChunk的整数倍,最后一次fread读取到的小于sizeOfChunk的剩余内容会直接被丢弃,你直接发送了结束标记0\r\n\r\n,导致文件传输不完整。
  • 非核心兼容问题:JPG格式的标准Content-Type为image/jpeg,部分旧版本浏览器对image/jpg的兼容存在瑕疵。

修正方案

修改核心分块发送逻辑,移除对二进制内容的字符串操作,补充剩余内容处理逻辑,参考代码如下:

// 替换原有的while循环逻辑即可
size_t readBytes;
while((readBytes = fread(buf, sizeof(char), sizeOfChunk, fd)) > 0)
{    
    // 写入当前chunk的十六进制长度
    sprintf(amountOfBytes, "%zX\r\n", readBytes);
    if(write(socketCopy, amountOfBytes, strlen(amountOfBytes)) < 0)
    {
        perror("Write bytes error");
        exit(1);
    }

    // 直接发送读取到的二进制内容,不用字符串函数处理
    if(write(socketCopy, buf, readBytes) < 0)
    {
        perror("Write chunk content error");
        exit(1);
    }
    // 单独发送chunk结尾的\r\n
    if(write(socketCopy, "\r\n", 2) < 0)
    {
        perror("Write chunk end error");
        exit(1);
    }

    bzero(buf, sizeOfChunk);
    bzero(amountOfBytes, strlen(amountOfBytes));
}

修正后不需要再对buf做strcat操作,原有0\r\n\r\n的结束标记发送逻辑保持不变即可。

内容的提问来源于stack exchange,提问作者Taras Novosiadlyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 02:18:03