소켓이 있다고 가정합니다. 모든 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);
}
이 코드는 소켓에서 청크 분할 콘텐츠를 구문 분석하는 방법을 명확히하기위한 것입니다.
인터넷 검색 * http 청크 분할 전송 *을 시도 했습니까? – immibis
@immibis 물론 C와 함께 작업 중이며 관련 결과도 없습니다. – bobbybrown6969
아마도 구문 분석을 할 수있는 라이브러리가있을 것입니다. – Barmar