2017-09-07 16 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); 
} 

이 코드는 소켓에서 청크 분할 콘텐츠를 구문 분석하는 방법을 명확히하기위한 것입니다.