C语言实现HTTP GET请求解析逐行打印功能出现多余换行问题咨询
C语言Socket HTTP请求逐行解析问题修复方案
问题根因
- 错误1:
process函数传入的处理长度是固定500,而非实际读取到的字节数valread。buffer中未被实际请求填充的区域都是初始值\0,遍历这些空区域时会触发逻辑异常,产生大量多余空行。 - 错误2:打印行内容前未给
line字符串追加字符串终止符\0,printf("%s")依赖\0判断字符串结束,缺失会导致内存越界,输出乱码、多余换行。 - 错误3:
\n判断逻辑顺序错误:检测到\n时,先打印了未包含\n的当前行,之后还会把\n存入下一行的首个字符,导致下一行开头多一个换行。 - 错误4:
line_len == 148就强制重置的逻辑不合理,会截断长度超过148的HTTP头行,引发内容异常。 - 错误5:
memset清空行的范围不正确,仅清空了当前行长度的区域,之前行残留的长内容仍可能留在line的后半段,下次打印短行时会带出残留内容。 - 错误6:动态申请的
line内存未释放,会产生内存泄漏。
修复步骤
- 修改main函数中的process调用参数,将固定长度500改为实际读取到的字节数valread:
// 原代码 process(buffer,500,'r'); // 修改后 process(buffer, valread, 'r');
- 替换process函数为修复后的版本:
void process(char *buffer,int size,char status) { int i=0; int line_len=0; // 扩大行缓存至1501字节,预留1字节存字符串终止符\0 char *line = malloc(sizeof(char) * 1501); while(i < size) { // 行满1500字节强制打印,避免缓存溢出 if(line_len == 1500) { line[line_len] = '\0'; printf("line overflow force print: %s\n", line); printf("_____________________________________________\n"); memset(line, 0, 1501); line_len = 0; } if(buffer[i] == '\n') { printf("line break found\n"); // 追加终止符再打印 line[line_len] = '\0'; // 过滤HTTP标准换行中的\r字符 if(line_len > 0 && line[line_len -1] == '\r') { line[line_len -1] = '\0'; } printf("%s\n", line); printf("_____________________________________________\n"); // 清空整行缓存 memset(line, 0, 1501); line_len = 0; // 跳过当前\n,不存入下一行 i++; continue; } line[line_len] = buffer[i]; line_len++; i++; } // 处理最后一行无换行符的场景 if(line_len > 0) { line[line_len] = '\0'; printf("last line no break: %s\n", line); printf("_____________________________________________\n"); } // 释放动态申请的内存 free(line); }
额外优化建议
每次接收新请求前清空buffer,避免上一次请求的残留内容干扰本次解析,可以在valread = read( new_socket , buffer, (500));前添加代码:
memset(buffer, 0, sizeof(buffer));
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

