#include <sstream> #include <string> #define BUFFER_SIZE 256 const char g_szHeader[] = "HTTP/1.1 200 OK\r\n" "Connection: Keey-Live\r\n" "Content-Type: text/xml\r\n\r\n"; // 响应报文头解析 bool HttpRespHeaderPrase(const std::string& strHeader) { if ( strHeader.empty() ) { return false; } // 行缓冲区 char szLineBuf[BUFFER_SIZE] = {0}; // 通过流来提取报文头中内容 std::stringstream ssHeader(strHeader.c_str()); // 提取第一行内容 ssHeader.getline(szLineBuf, sizeof(szLineBuf), '\r'); // 获取HTTP版本 char szHttpVersion[BUFFER_SIZE] = {0}; sscanf(szLineBuf, "HTTP/%[^ ]", szHttpVersion); // 获取状态码 strtok(szLineBuf," "); int iStatusCode = atoi(strtok(NULL, " ")); // 逐行提取余下的报文参数名值对 std::string strParamName; std::string strParamValue; for (;;) { // 提取一行内容 ssHeader.getline(szLineBuf, sizeof(szLineBuf), '\r'); // 跳过参数名之前的无效字符 size_t count = strspn(szLineBuf, "\r\n "); // 有效起始地址 char* start = szLineBuf + count; // 解析完毕 if ( 0 == strlen(start) ) { break; } // 查找冒号出现的位置 char* p = strchr(start, ':'); if ( p - start > 0 ) { strParamName.assign(start, p - start); } else { // 解析出错 return false; } // 跳过无效字符 count = strspn(p, ": "); strParamValue.assign(p + count); } return true; } int main(int argc, char* argv[]) { HttpRespHeaderPrase(std::string(g_szHeader)); return 0; }