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的剩余缓冲区大小,容易发生缓冲区溢出,溢出后也会产生随机字符甚至程序崩溃。
修复方案
- 每次
read调用后立刻给缓冲区补结束符:
readSock = read(acceptSock, recvLine, sizeof(recvLine)-1); if (readSock > 0) { recvLine[readSock] = '\0'; // 补字符串结束符 }
- 找到
\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;
- 循环读取剩余的 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';
- 改用
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'; }
- 后续处理 POST 内容时,严格按照
contentLen取内容,不要用strlen计算endOfPost后的长度,避免遇到特殊字符截断。
内容的提问来源于stack exchange,提问作者logsInMyEyes69
相关产品推荐
相关产品推荐

