我有一台服务器,它发送分块的传输编码数据。我使用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 OK

传输编码:分块

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

伺服器:CHND

3

好\ n

3

CMD

客户端仅读取前3个字节的块。当我尝试读取下一个3个字节的块“CMD”时,它不起作用。

请帮助客户端进行哪些必要的更改?还是服务器端需要额外处理?

最佳答案

我遇到了类似的问题,您需要使用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请求的数据,并且这似乎要处理分块编码,因为字节数(“块”长度)不会显示在recv缓冲区中,因此我们不能以原始形式使用它。

注意:我的程序是C语言,而不是C++语言,但是您会逐渐了解。

关于c++ - InternetReadFile对于分块响应失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25929735/

10-11 12:21