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

C语言Web服务器读取HTTP POST请求末尾出现随机字符是什么原因

问题原因
  • 未给套接字读取缓冲区补字符串结束符:C 语言的字符串以\0作为结束标记,你调用read读取数据到recvLine、tempFull后,没有在读取到的字节末尾手动补\0,后续调用strcat时会读取缓冲区后未初始化的随机内存内容,最终产生随机乱码。
  • 未处理read的部分返回:TCP 是流协议,单次read调用不保证返回你请求的全部字节数,你直接调用一次read读取contentLen长度的内容,大概率只能拿到部分 POST 数据,和你调试时看到的tempFull只有部分数据的现象吻合。
  • 漏算已读取的 POST 内容:你第一次调用read读取请求头的时候,很可能已经把部分 POST body 一起读到了recvLine里,你找到\r\n\r\n分隔符后没有扣除已经读到的 body 长度,直接再去读完整的contentLen字节,要么多读了后续内容,要么和已有的内容重复拼接。
  • 字符串拼接操作不安全:使用strcat拼接时没有校验fullResp的剩余缓冲区大小,容易发生缓冲区溢出,溢出后也会产生随机字符甚至程序崩溃。
修复方案
  1. 每次read调用后立刻给缓冲区补结束符:
readSock = read(acceptSock, recvLine, sizeof(recvLine)-1);
if (readSock > 0) {
    recvLine[readSock] = '\0'; // 补字符串结束符
}
  1. 找到\r\n\r\n分隔符后,先计算已读取的 POST body 长度:
size_t header_len = endOfPost - fullResp + 4;
size_t already_read_body_len = strlen(fullResp) - header_len;
size_t remain_body_len = contentLen > already_read_body_len ? (contentLen - already_read_body_len) : 0;
  1. 循环读取剩余的 POST body,确保读够指定长度:
size_t total_read = 0;
while (total_read < remain_body_len) {
    ssize_t n = read(acceptSock, tempFull + total_read, remain_body_len - total_read);
    if (n <= 0) {
        // 自行处理读错误或连接断开逻辑
        break;
    }
    total_read += n;
}
tempFull[total_read] = '\0';
  1. 改用memcpy拼接内容,同时校验缓冲区长度避免溢出:
// 这里假设fullResp总大小为预先定义的FULL_RESP_BUF_SIZE,自行替换为实际值
size_t current_full_len = strlen(fullResp);
if (current_full_len + total_read < FULL_RESP_BUF_SIZE) {
    memcpy(fullResp + current_full_len, tempFull, total_read);
    fullResp[current_full_len + total_read] = '\0';
}
  1. 后续处理 POST 内容时,严格按照contentLen取内容,不要用strlen计算endOfPost后的长度,避免遇到特殊字符截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:54:07