当前位置: 技术问答>linux和unix
HTTP协议分析,求指导!!!chunked + gzip 怎么解析?!!帮下我呀
来源: 互联网 发布时间:2017-02-24
本文导语: 本帖最后由 taylorshuang 于 2012-05-27 02:22:58 编辑 兄弟们指导下我吧,我在分析HTTP协议,但是当收到传输编码为chunked,内容编码为gzip时,就没法解析数据包的内容,采用下面的代码解析时,采用GDB调试,发现数据并没有完全的传...
/*
pSrc: 原 chunked 数据包
nSize: 数据包大小
pDes: 解析完成后的数据
*/
int DecodeChunked(const char* pSrc,int nSize, char** pDes)
{
int nRetSize = 0, nLeftSize = 0;
printf("total data length=%d; /n",nSize);
*pDes = (unsigned char*)malloc(nSize);
if(pDes == NULL)
return -1;
char *pBegin = strstr(pSrc,"/r/n/r/n");//程序运行到这里pBegin为空,大家说怎么办
if (pBegin == NULL)
return -1;
pBegin += 4;
while(1)
{
int ChunkedSize = 0;
sscanf(pBegin,"%x",&ChunkedSize);
if( 0==ChunkedSize )
{
puts("endof chunkeds");
break;
}
pBegin = strstr(pBegin,"/r/n");
if (pBegin == NULL)
return -1;
pBegin += 2; // /r/n
nLeftSize = nSize - (pBegin - pSrc);
if (ChunkedSize > nLeftSize)
ChunkedSize = nLeftSize;
memcpy(*pDes+nRetSize,pBegin,ChunkedSize);
nRetSize += ChunkedSize;
if (ChunkedSize == nLeftSize) /* 数据包不全 */
break;
pBegin += ChunkedSize;
if (strstr(pBegin,"/r/n") != NULL)
pBegin += 2; // /r/n
else break;
}
return nRetSize;
}
GDB调试情况:
Breakpoint 1, need_to_parse_chunked_data (data=0xbffddbbc "arn37213b", len=15, buf=0xbffbdbbc "") at http.c:281
281 char strlength[10]={0};
(gdb) n
283 char * temp = buf;
(gdb)
284 int total =0, length = 0, nBytes = 0;
(gdb)
286 pTemp = strstr(pStart, "rn");
(gdb) n
287 if( NULL == pTemp )
(gdb) p data
$1 = 0xbffddbbc "arn37213b" 这个数据包其实有1209个字节,但子函数里就只能看到这么一点点,我怀疑就是这里出问题了,但我又没有好的办法。gzip 文件中时包好多的0字符串,不知道有影响没
(gdb)
|
原来你是不会写服务端程序.... 那我没法教你了, 口诀:
1次读,多次拆.