InternetReadFile无法进行分块响应

时间:2014-09-19 08:39:46

标签: c++ wininet chunked-encoding http-1.1 getlasterror

我有一个发送分块传输编码数据的服务器。我使用InternetReadFile读取数据,但InternetReadFile在读取第一个块后失败了12004。我使用了一个小提琴手(Wireshark)拦截收到的数据。 Wireshark显示第二个块但InternetReadFile API失败。

示例代码:

    CString totalbuffer ;

    While ( 1 )
    {
      char recv [ 10 ] = '\0' ;
      DWORD dwBytesRead = 0 ;
      if ( InternetReadFile ( httpSocket.hReq , recv, 10 , &dwBytesRead ) )
      {
         recv[ dwBytesRead] = '\0' ;
         totalbuffer += recv ;
         printf ( " received buffer : %s" , recv ) ;
         return 1 ;
      }
      else
      {
         printf ( " InternetReadFile failed with : %d" , GetLastError ( ) ) ;
         return 0 ;
      }
    };  

WireShark显示:

HTTP / 1.1 200确定

Transfer-Encoding:chunked

日期:星期四,2014年9月18日14:16:16 GMT

服务器:CHND

3

确定\ n

3

CMD

客户端只读取前3个字节的块。当我尝试读取下一个3字节块“CMD”时,它无法正常工作。

请帮助客户端进行必要的更改吗?或者服务器端是否需要处理额外的事情?

1 个答案:

答案 0 :(得分:1)

我有类似的问题,你需要"查询"使用InternetQueryDataAvailable()连接任何额外信息:

  while(TRUE)
  {
    res = InternetQueryDataAvailable(hr, &len, 0, 0);
    if (!res || len == 0) break;

    res = InternetReadFile(hr, recv, len, &dwbread);
    if(!res || (res && dwbread == 0)) break;
    totalbuffer += recv ;
    ...
  }

使用它,它将查看是否有来自此HTTP请求的更多数据,并且这似乎照顾了分块编码,因为字节数(" chunk" length )不会出现在recv缓冲区中,因此我们无法以原始形式使用它。

注意:我的程序是用C语言编写的,而不是C ++,但是你会得到漂移。