2017-11-22 4 views
1

내 작업은 간단한 HTTP 서버를 구현하는 것입니다. HTTP를 통해 다운로드하는 사이트를 열려고합니다. 내 서버에 html, css 및 js 파일이 제대로 표시되지만 이미지 (png, jpg)가 표시되지 않습니다. Wireshark를 사용하여 응답 패킷을 기록했습니다.c- 소켓의 HTTP 서버가 올바른 이미지를 표시하지 않습니다.

HTTP/1.1 200 OK 
Connection: keep-alive 
Transfer-Encoding: chunked 
.PNG 
. 

또한 요청을 읽고 클라이언트에 응답을 보내는 기능입니다.

static int serve_request(int sock, struct conf_arg *arg, char version[]) 
{ 
    FILE *html = NULL; 
    char buf[MAX_MSG]; 
    const unsigned chunk = (unsigned)CHUNK_SIZE; 
    char *pbuf = NULL; 
    char tempbuf[CHUNK_SIZE + 3]; 
    size_t len; 

    strcpy(buf, arg->root); 
    if(buf[strlen(buf) - 1] == '/') 
     strcat(buf, arg->defdoc); 
    html = fopen(buf, "rb"); 
    if (!html) { 
     not_found(sock, version); 
     return -1; 
    } 
    good_responce(sock, version); 
    do { 
     if (fgets(buf, sizeof(buf), html) == NULL) 
      break; 
     pbuf = buf; 
     while ((len = strlen(pbuf)) != 0) { 
      if (len < chunk) { 
       //printf("LEN:%d\n", (int)len); 
       sprintf(tempbuf, "%x\r\n", (int)len); 
       write(sock, tempbuf, strlen(tempbuf)); 
       write(sock, pbuf, strlen(pbuf)); 
       //printf("%s", pbuf); 
       pbuf += len; 
       write(sock, "\r\n", 2); 
      } else { 
       sprintf(tempbuf, "%x\r\n", (int)chunk); 
       write(sock, tempbuf, strlen(tempbuf)); 
       //strncpy(tempbuf, pbuf, chunk); 
       //printf("%d\n%s\n", (int)chunk, tempbuf); 
       write(sock, pbuf, chunk); 
       pbuf += chunk; 
       write(sock, "\r\n", 2); 
      } 
     } 
    } while (!feof(html)); 
    strcpy(tempbuf, "0\r\n\r\n"); 
    write(sock, tempbuf, strlen(tempbuf)); 
    fclose(html); 
    return 0; 
} 

어디서 문제인지 파악할 수 없으므로 도와주세요.
UPD : 열린 모드를 rb로 변경했지만 도움이되지 않습니다. 나는 Wireshark에서 같은 결과를 얻는다.

+0

파일을 텍스트 모드로 열면 문제가 될 수 있습니다. –

+0

그리고 어떤 모드를 사용해야합니까? –

+0

바이너리 모드. 그건 물론 문제가 –

답변

2

이미지 파일을 이진 모드로 열어야합니다.

이진 파일 읽기 작업을 사용해야합니다. 현재 읽은 버퍼는 바이너리이므로 strlen이 없습니다. 버퍼의 크기는 read 조작에 의해보고됩니다.

소켓에 쓰기 또한 이진이므로 을 사용하고 n_bytes을 보내려는 버퍼의 바이트 수를 사용하십시오. write(sock, pbuf, strlen(pbuf));이 작동하지 않습니다.

모든 이진 연산을 사용하기 위해 코드를 다시 작성할 수도 있습니다. css 및 html 파일은 텍스트로 취급 할 때 바이너리로 처리하는 것처럼 쉽게 전송할 수 있습니다. 코드를 모든 바이너리로 변경하면 모든 유형의 파일에 문제가 발생하지 않습니다.

2

당신이 바이너리 모드에서 이미지 파일을 열 수 없습니다 것을 매우 가능성이 높습니다 : 바이너리 모드를 지정하지 않으면

{ 
    FILE *fp; 
    char buffer[512]; 

    fp = fopen("image_file.png", "rb"); 
    while... 

, 당신은 이상한 물건이 바이너리 데이터에 일어날 것입니다.

또한 사용자는 fgets을 사용하고 있으며이 특성상 바이너리 데이터로 수행하려는 작업과 호환되지 않습니다. 살펴 봐야합니다 fread()

+0

시도했지만 작동하지 않습니다. –

+0

Ah ... Updated Answer –

+0

fread()에 대한 한 요소의 크기를 어떻게 알 수 있습니까? –