2017-09-07 22 views
0

私はWinsockを使用しています。サーバーにリクエストを送信し、HTTPヘッダーに「Transfer-Encoding:chunked」が含まれています。 「Content-Length:xxxxx」が含まれている場合は明らかですが、チャンクされている場合はrecv()を使用してデータをバッファに解析するにはどうすればよいですか?チャンクされたHTTP応答を解析します。

いくつかの擬似コードや説明をいただければ幸いです。

+0

グーグル* httpチャンク転送コード*を試しましたか? – immibis

+0

@immibisもちろん、私はCと仕事しており、関連する結果はありませんでした。 – bobbybrown6969

+0

おそらく、あなたのために解析するライブラリがあります。 – Barmar

答えて

0

ソケットがあるとします。すべてのHTTPヘッダーが(このソケットから)受信されました。ソケットからチャンクされたコンテンツを受け取る単純化されたアルゴリズムです。

#define MAX_SIZE 1024 

char *RecvChunked(SOCKET s) 
{ 
    int chunk_length; 
    char result[MAX_SIZE]; 
    char *result_ptr; 

    memset(result,0,sizeof(result)); 

    for (chunk_length=0, result_ptr=result;;) 
    { 
     int recv_size; 
     int size; 

     if (chunk_length == 0) // get chunk length 
     { 
      char str[MAX_SIZE]; 
      char *ptr; 

      // RecvLn 
      for (ptr=str; ptr-str+sizeof(char) < sizeof(str);) 
      { 
       int ret = recv(s, ptr, sizeof(char), 0); 
       if (ret <= 0) 
       { 
        break; 
       } 

       if (*ptr != '\n') 
       { 
        ptr += ret; 
        continue; 
       } 

       if (ptr-str <= 1) 
       { 
        break; 
       } 

       if (*(ptr-1) == '\r') 
       { 
        ptr --; 
       } 
       break; 
      } 

      *ptr = '\0'; 

      chunk_length = (int)strtol(str, NULL, 16); // HexToInt 
     } 
     recv_size = MIN(sizeof(result)-(result_ptr-result)-sizeof(char), chunk_length); 

     if (recv_size == 0) 
     { 
      break; // nothing to receive 
     } 

     size = recv(s, result_ptr, recv_size, 0); 

     if (chunk_length >= size) 
     { 
      chunk_length -= size; 
     } 
     else 
     { 
      chunk_length = 0; 
     } 

     result_ptr += size; 

     if (size == 0) 
     { 
      // Disconnected ? 
      break; 
     } 

     if (chunk_length == 0) // recv '\r\n' at the end of every chunk 
     { 
      char str[2]; 
      if (recv(s, str, sizeof(str), 0) < 2) 
      { 
       break; // Disconnect ? 
      } 
     } 
    } 
    return strdup(result); 
} 

このコードは、チャンクされたコンテンツをソケットから解析する方法を明確にするためのものです。

関連する問題