2017-11-22 9 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オペレーションによって報告されます。

ソケットに書き込むこともバイナリであるため、write(sock, pbuf, strlen(pbuf));は動作しません。write(sock, pbuf, n_bytes);n_bytesとし、送信するバッファのバイト数を使用してください。

これは、すべてのバイナリ操作を使用するようにコードを書き直すことを意味します。 cssとhtmlファイルは、それをテキストとして扱うバイナリとして扱うことができます。コードをすべてバイナリに変更すると、どのタイプのファイルでも問題は発生しません。

2

あなたがバイナリモードで画像ファイルを開いていない可能性が極めて高いです:

{ 
    FILE *fp; 
    char buffer[512]; 

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

あなたはバイナリモードを指定しない場合、あなたは奇妙なものがあなたのバイナリデータに起こる必要があります。

さらに、fgetsを使用しています。その性質上、バイナリデータの処理には互換性がありません。調べる必要がありますfread()

+0

私はそれを試しましたが、うまくいきません。 –

+0

Ah ...更新済み回答 –

+0

fread()の要素のサイズを知るにはどうすればよいですか? –

関連する問題