1

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

传输编码:分块

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

服务器:CHND

3

好的\n

3

命令

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

请帮助客户端应该做哪些必要的更改?还是服务器端需要处理一些额外的事情?

4

1 回答 1

2

我有一个类似的问题,您需要使用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++,但你会明白的。

于 2015-07-13T10:40:52.780 回答