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
相关产品推荐
相关产品推荐

