1. 程式人生 > >C++做HTTP服務應用 在Socket套接字中對HTTP頭的處理

C++做HTTP服務應用 在Socket套接字中對HTTP頭的處理

這些天都在弄個手機控制電腦的應用..

在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 的長度在進行處理