strLine += 4;
}else{
if (bIsChunked)
{
strLine = strstr(buffer, "\r\n");
if (!strLine) break;
strLine += 2;
}else{
strLine = buffer;
}
}
if (bIsChunked)
{
nChunkSize = strtoul(strLine, NULL, 16);
if (nChunkSize == 0) break;
nChunkData = strstr(strLine, "\r\n");
if (!nChunkData) break;
nChunkData += 2;//'\r\n'
int nLen = nResult - (nChunkData - buffer);
try_l:
if (nChunkSize >= nLen)
{
nChunkNow = nChunkSize - nLen;
cBuf.Write((PBYTE)nChunkData, nLen);
//循环将当前分块数据全部得到
while (nChunkNow)
{
BYTE *data = new BYTE[nChunkNow];
nResult = recv(sock, (char *)data, nChunkNow, 0);
//没进行错误处理
cBuf.Write(data, nResult);
nChunkNow = nChunkNow - nResult;
delete[] data;
}
}else{
//判断是否为gzip的
tstr = strstr(buffer, "Content-Encoding:");
if (tstr)
{
tstr = strstr(tstr, "gzip");
if (tstr) bIsGzip = true
}
if (cBuf.GetBufferLen() <= 0) return false;
char *szRetScr;
if (bIsGzip)
{
//小于1024-nLen
cBuf.Write((PBYTE)nChunkData, nChunkSize);
strLine = nChunkData + nChunkSize + 2; //+回车(2)
nChunkSize = strtoul(strLine, NULL, 16);
if (nChunkSize == 0) break;
nChunkData = strstr(strLine, "\r\n");
if (!nChunkData) break;
nChunkData += 2;// '\r\n'
int nLen = nResult - (nChunkData - buffer);
goto try_l;
}
}else{
cBuf.Write((PBYTE)strLine, nResult);
}
//调用Gzip类解压数据
CGZIP2A cGzip(cBuf.GetBuffer(),cBuf.GetBufferLen());
size_t count = strlen(cGzip.psz);
szRetScr = (char *)malloc(cGzip.Length + 1);
memcpy(szRetScr, cGzip.psz, cGzip.Length);
szRetScr[cGzip.Length] = 0;
}else{
szRetScr = (char *)malloc(cBuf.GetBufferLen() + 1);
memcpy(szRetScr, cBuf.GetBuffer(), cBuf.GetBufferLen());
szRetScr[cBuf.GetBufferLen()] = 0;
}
*szScr = szRetScr;
return true;
}
其中 gzip数据也可以使用zlib库(gzFile)进行解压缩。
这样处理下来我们就可以对压缩数据进行处理了。
应用
我们采用压缩算法,可以有效的减少网络传输量,从而优化客户端,减轻服务端负载,
大大优化了数据传输的速度。我们以
后为网站写客户端都可以很方便的使用这种方式,不必再为数据传输的慢而烦恼了!
|