2012-07-23 4 views
4

청크 형 HTTP 전송을 구문 분석해야하는 클라이언트를 개발 중입니다. 나는 다음과 같은 오류를 알아 내려고 벽에 머리를 때려서 누군가가 내 오류를 좀 더 빨리 잡을 수 있다면 그것을 고맙게 생각할 것이다. 문제를 요약하면 다음과 같습니다. 클라이언트가 모든 청크를받지 못해 나머지 프로세스가 엉망이됩니다. 미리 감사드립니다! 최소한C 구문 분석 HTTP 청크 분할 전송 인코딩 응답

while(cflag){ 
    pfile_chunk = malloc(CHUNK_SIZE+1); 
    memset(pfile_chunk, 0, CHUNK_SIZE); 
    cPtr = pfile_chunk; 
    cPtr2 = NULL; 
    k=0; 
    while(*(cPtr-1) != '\n'){ 
     k++; 
     recv(sock, cPtr, 1, 0); 
     cPtr = pfile_chunk+k; 
    } 
    cPtr2 = strchr(pfile_chunk, '\r'); 
    *cPtr2 = '\0'; 
    sscanf(pfile_chunk, "%x", &l); 
    if(l == 0) 
     break; 
    printf("\nServer wants to deliver %ld bytes.\n", l); 
    pfile_chunk = realloc(pfile_chunk, l+1); 
    memset(pfile_chunk, 0, l); 
    recv(sock, pfile_chunk, l, 0); 
    fputs(pfile_chunk, f); 
    printf("GOT THIS, SIZE %ld:\n%s\n", strlen(pfile_chunk), pfile_chunk); 
    //get next \r\n bytes. 
    recv(sock, NULL, 2, 0); 
} 
+0

나는 부주의 한 코드에 대해 미리 사과한다. 그것은 나에게 많은 다른 것을 시도한 결과였다. –

+0

최종 정리 코드를 게시 하시겠습니까? 나는이 일에도 어려움을 겪고있다. 버퍼에서 읽은 내용을 실제 HTTP 청크로 조정하는 방법을 잘 모릅니다. 청크를 분석하기 전에 전체 HTTP 응답을 저장합니까? –

답변

5

, 당신은 당신이 얻을 것으로 예상되는 바이트 수를 받고 있는지 확인하기 위해 recv의 반환 값을 확인해야합니다.

시스템 호출은 호출 할 때 소켓 수신 버퍼에서 사용할 수있는 것이 무엇이든 반환하기 때문에 네트워크에서 확실히 읽을 수 있습니다.

전체 청크를 읽을 때까지 루프를 구현하거나 MSG_WAITALL 플래그를 마지막 매개 변수 recv으로 전달하십시오. 그러나 여전히 오류가 있는지 확인하려면 recv에서 확인해야합니다. 당신의 while 루프에서 체크를위한 당신의 첫 번째 역 참조가 동작을 원하는되지 않을 가능성이 배열의 시작 이전에 액세스하는 것처럼

ssize_t r = recv(sock, pfile_chunk, l, MSG_WAITALL); 
if (r < l) { 
    /* check for errors ... */ 
} else { 
    /* got the data */ 
} 
+0

고마워요, 나는 send/recv 플래그를 고려하지 않았습니다. 오류 검사는 내가 서둘러 코드를 움직이는 서두를 타고 있었기 때문에 존재하지 않았다. 고맙습니다! 누군가이 사람 +1, 나는 필요한 평판이 없다. –

2

는 것 같습니다. 다행히도 해당 메모리 위치에는 일반적으로 \n이 포함되지 않습니다. 그건 너의 read을 엉망으로 만들 수있다. 과 관련하여 약간의 정보가 포함되어있을 것으로 예상됩니다 (\n 일 가능성이 거의 없음).

CHUNK_SIZE+1을 보내기 전에 소켓의 다른 쪽 끝을 믿어서 \n을 제공 할 수 있습니다. 그렇지 않으면 seg-fault가 발생할 수 있습니다. 그러나 일반적으로 보낸 사람은 청크 헤더에 대해 10 자 이하의 ASCII 숫자 문자와 CRLF를 보내는 것이 좋지만 이론적으로는 긴 청크 확장 헤더 필드를 보낼 수 있습니다.

그 외에도, 이미 user315052에 의해 발견 된 중요한 문제가 있습니다. recv 메소드에 요청한 모든 데이터를 기다리거나 실제로 읽은 데이터의 양을 확인해야합니다.

관련 문제