專案需要c++實現http報文的收發,網上找了下發現沒有合適的,自己動手寫了個。
可解析如下兩類報文:
1.乙個報文包含多個chunk
2.乙個chunk包含在多個報文中(極端情況下,乙個報文只含有乙個位元組)
**如下:
//解析函式
//狀態跳轉,設定狀態
ptask->m_head_processing = false;
ptask->m_length_processing = true;
ptask->m_length_info_start_pos = ptask->h_len;//指向頭部的下乙個位置
//log(info, "head process success m_length_info_start_pos:%u, m_len:%u", ptask->m_length_info_start_pos,ptask->m_len);
// printbuff(ptask->m_buf,ptask->m_len,ptask);
}
//log(info, "data_len:%u", data_remain_len);
if(0 >= data_remain_len || null == data_remain_start)
if(ptask->m_length_processing)
int tmplen = data_remain_len;
data_remain_len = (ptask->m_buf + ptask->m_len) - (strstr(ptask->m_buf+ptask->m_length_info_start_pos, "\r\n") + 2);
data_remain_start += (tmplen - data_remain_len);
if(null == data_remain_start || data_remain_len < 0)
return false; //http資料錯誤,不再處理,還沒到資料部分,無需儲存到jsonbuf
//data_remain_start += 2;
//data_remain_len -= (data_remain_start-ptmp);
//if(data_remain_len < 0)
// return false;//http資料錯誤,不再處理
ptask->m_length_processing = false;
ptask->m_chunk_processing = true;
ptask->m_chunk_copyed = 0;
// log(info, "length_processing success data_remain_len:%d chunk_len:%u", data_remain_len, ptask->m_chunk_len);
}else
}if(ptask->m_chunk_processing)
else
ptask->m_chunk_copyed += copy_size;
ptask->m_buff_copy_len += copy_size;
data_remain_len -= copy_size;
data_remain_start += copy_size;
// log(info, "chunk_processing data_remain_len:%d", data_remain_len);
if(copy_size == chunk_data_remain_len)
else
}if(ptask->m_linefeed_processing)
log(info, "linefeed processing ,recving the next packet");
return false;
}//輔助函式
HTTP報文解析
超文字傳輸協議 hypertext transfer protocol,簡稱http 是應用層協議。http 是一種請求 響應式的協議,即乙個客戶端與伺服器建立連線後,向伺服器傳送乙個請求 伺服器接到請求後,給予相應的響應資訊。http請求報文分為三部分 請求行 請求頭部 請求包體 由方法字段 ur...
HTTP特點與報文解析
http允許傳輸任意型別的物件 正在傳輸的型別有content type content type是http包中用來表示內容型別的標識 加以標記 無連線的含義是限制每次連線只處理乙個請求 伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線 採用這種方式可以節省傳輸時間 http是無狀態協議 無狀...
HTTP的報文格式解析
http報文是面向文字的,報文中每乙個欄位都是一些ascii碼串,各個欄位的長度是不確定的。http有兩類報文 請求報文 響應報文 乙個http請求報文由 四部分組成 a 請求行 請求行由請求方法字段 url欄位和http協議版本字段,組成,它們用空格分隔,例如 get index.html htt...