私の仕事は簡単な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で同じ出力を得る。
ファイルをテキストモードで開くと、これが問題になることがあります。 –
どのモードを使うべきですか? –
バイナリモード。それはもちろん、バイナリの問題 –