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

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内存未释放,会产生内存泄漏。

修复步骤

  1. 修改main函数中的process调用参数,将固定长度500改为实际读取到的字节数valread:
// 原代码
process(buffer,500,'r');
// 修改后
process(buffer, valread, 'r');
  1. 替换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:54:03