这些天都在弄个手机控制电脑的应用..
在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 的长度在进行处理