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

C语言TCP Socket过滤换行符后无法打印问题排查

问题原因及解决方法

核心问题:recv返回的数据未添加字符串终止符

recv函数仅将接收到的字节写入buff,不会自动在末尾添加'\0',而strlen(buff)完全依赖'\0'来计算字符串长度。如果buff中没有终止符,strlen会读取内存中超出接收数据的部分,直到遇到随机的'\0',这会直接导致循环逻辑异常:

  • 若strlen返回0,循环直接不执行,自然没有过滤后的输出;
  • 若返回错误的长度,可能引发内存越界或循环提前终止。

你调用printf("%s", buff)能打印原始内容只是巧合——要么buff之前的内存刚好有'\0',要么打印到了内存中随机的终止符才停止,属于未定义行为。

修复后的代码

修改时需要用recv返回的bytes值控制循环,同时手动添加终止符保证字符串操作安全:

void receiveHTTP(int clientSockfd, char *buff, size_t __n, int __flags)
{
    int bytes = recv(clientSockfd, buff, __n - 1, __flags); // 预留1字节给'\0',防止溢出
    if (bytes <= 0) {
        // 处理接收失败或连接关闭的情况
        return;
    }
    buff[bytes] = '\0'; // 手动添加字符串终止符
    printf("原始请求:\n%s\n", buff);
    
    printf("过滤后内容:\n");
    for (int i = 0; i < bytes; i++) // 用实际接收的字节数循环,比strlen更可靠
    {
        if (buff[i] != '\n'){
            printf("%c", buff[i]);
        }
    }
    printf("\n");
}

额外注意事项

  • 调用recv时必须预留一个字节给'\0',避免缓冲区溢出;
  • 优先使用recv返回的bytes值遍历数据,比strlen更安全——HTTP请求理论上是文本,但如果出现异常数据(比如中间混入'\0'),strlen会直接计算错误。

内容的提问来源于stack exchange,提问作者Mehan Alavi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:14:51