当前位置:  技术问答>linux和unix

HTTP协议分析,求指导!!!chunked + gzip 怎么解析?!!帮下我呀

    来源: 互联网  发布时间:2017-02-24

    本文导语:  本帖最后由 taylorshuang 于 2012-05-27 02:22:58 编辑 兄弟们指导下我吧,我在分析HTTP协议,但是当收到传输编码为chunked,内容编码为gzip时,就没法解析数据包的内容,采用下面的代码解析时,采用GDB调试,发现数据并没有完全的传...

本帖最后由 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次读,多次拆.

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.xml.ws.http接口httpbinding成员方法: http_binding定义参考
  • 防病毒的HTTP代理服务器 HTTP Anti Virus Proxy
  • java命名空间java.net枚举proxy.type的类成员方法: http定义及介绍
  • HTTP开发工具包 http-kit
  • java命名空间javax.print.attribute.standard类referenceurischemessupported的类成员方法: http定义及介绍
  • Java HTTP客户端 http4j
  • java命名空间java.net类httpurlconnection的类成员方法: http_accepted定义及介绍
  • 如何设置服务器, 使http://localhost/hello.php变成http://www.example.com/hello.php生效?
  • java命名空间java.net类httpurlconnection的类成员方法: http_unauthorized定义及介绍
  • Java HTTP 客户端开发包 jcabi-http
  • java命名空间java.net类httpurlconnection的类成员方法: http_created定义及介绍
  • linux c socket http编程 返回http消息体出错!
  • java命名空间java.net类httpurlconnection的类成员方法: http_forbidden定义及介绍
  • 请问如何在c程序里调用一段http地址,比如http://test/reload.jsp
  • java命名空间java.net类httpurlconnection的类成员方法: http_gone定义及介绍
  • 为什么输http://www.china-java.net,会自动改为http://www.china-java.net:8081?
  • java命名空间java.net类httpurlconnection的类成员方法: http_ok定义及介绍
  • http协议中文分词 http-scws
  • java命名空间java.net类httpurlconnection的类成员方法: http_conflict定义及介绍
  • MM求助:怎样多线程下载http://java.sun.com上的东东? 用http方式,谢谢了.
  • java命名空间java.net类httpurlconnection的类成员方法: http_reset定义及介绍
  • 异步 HTTP 客户端开发包 android-async-http


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3