C++做HTTP服務應用 在Socket套接字中對HTTP頭的處理
阿新 • • 發佈:2019-02-07
這些天都在弄個手機控制電腦的應用..
在WEB上實現那必然就要處理GET與POST提交
起初在電腦上所有瀏覽器都沒有什麼問題
到了iPhone 上就出現在POST引數無法接收
以為是JS褲中的AJAX在Safari有問題..但是發現多次提交有時也可以接收引數
想到可能Safari把HTTP頭與POST引數分兩次傳送..
所以一次是無法完全接收所有頭資料
if (recv(sock, buf, 1024, 0) == SOCKET_ERROR){<pre name="code" class="cpp"><span style="white-space:pre"> </span>throw(0)<pre name="code" class="cpp">}
解決的方法就要判斷Recv接收回來的是否為一個完整的HTTP頭
我的程式很簡單.有POST提交時是必定有引數的
//定義接收資料的變數 char * buf = new char[WEBHEAD_MAX]; //定義處理recv接收資料的變數 char * recvBuf = new char[WEBHEAD_MAX]; int nRet = 0; memset(buf, 0, WEBHEAD_MAX); memset(recvBuf, 0, WEBHEAD_MAX); while (true){ nRet = recv(sock, recvBuf, WEBHEAD_MAX, 0); if (nRet > 0){ strncat(buf, recvBuf, nRet); //判斷如HTTP頭中第一個字元是 P 那麼就認為這是一個POST請求 //那麼接下來判斷最後4個字元是否為 \r\n\r\n, 如果是說明整個頭未接收完成 if (buf[0] == 'P' && recvBuf[nRet - 1] == '\n' && recvBuf[nRet - 2] == '\r' && recvBuf[nRet - 3] == '\n' && recvBuf[nRet - 4] == '\r'){ continue; } //下面是判斷GET是否完整的接收 if (buf[0] == 'G' && recvBuf[nRet - 1] != '\n' && recvBuf[nRet - 2] != '\r' && recvBuf[nRet - 3] != '\n' && recvBuf[nRet - 4] != '\r'){ continue; } break; } else { break; } } delete[]recvBuf;
當然如果你的程式還有上傳檔案等.或者POST提交資料很大..
那麼就要考慮先判斷Content-Length 的長度在進行處理