如何在C++ Windows httpPlatformHandler应用中定位char数组的 并获取POST数据指针
解决HTTP POST数据定位问题
方法一:使用strstr函数查找分隔序列
strstr函数可在字符串中定位指定子串的首次出现位置,刚好适配查找"\r\n\r\n"分隔符序列的需求。示例代码如下:
#include <cstring> // ... int recvLen = recv(socket, szRecvBuffer, sizeof(szRecvBuffer) - 1, 0); if (recvLen > 0) { // 给缓冲区添加字符串结束符,避免strstr越界访问 szRecvBuffer[recvLen] = '\0'; // 查找分隔符序列 char* pDelimiter = strstr(szRecvBuffer, "\r\n\r\n"); if (pDelimiter != nullptr) { // 指针后移4位,指向POST数据的起始位置 char* pPostData = pDelimiter + 4; // 可通过计算获取POST数据长度:int postDataLen = recvLen - (pPostData - szRecvBuffer); } }
方法二:手动遍历缓冲区(适配二进制数据场景)
如果POST数据包含二进制内容(如文件上传),缓冲区中可能存在'\0'字符,此时strstr会失效,建议用手动遍历的方式查找分隔符:
int recvLen = recv(socket, szRecvBuffer, sizeof(szRecvBuffer), 0); if (recvLen > 0) { char* pPostData = nullptr; char* p = szRecvBuffer; // 遍历缓冲区,确保剩余空间足够检查4个字符 while (p <= szRecvBuffer + recvLen - 4) { if (p[0] == '\r' && p[1] == '\n' && p[2] == '\r' && p[3] == '\n') { pPostData = p + 4; break; } p++; } if (pPostData != nullptr) { // 计算POST数据长度 int postDataLen = recvLen - (pPostData - szRecvBuffer); // 此处处理POST数据 } }
关键注意事项
- 处理分块接收:HTTP数据可能通过多次
recv返回,若首次接收未找到"\r\n\r\n",需保存已接收数据并继续调用recv,直到找到分隔符或缓冲区耗尽。 - 缓冲区边界控制:所有操作必须基于实际接收的字节数
recvLen,避免越界访问未初始化内存。 - 二进制数据兼容:涉及文件上传等二进制POST请求时,必须使用手动遍历方式,不能依赖字符串处理函数。
内容的提问来源于stack exchange,提问作者Roland Smith
相关产品推荐
相关产品推荐

