ポート2222に既存のファイル/home/ john / wwwを与えるだけの単純なサーバーを作成しています。私のwwwフォルダーには、index.html、server.c、client.cの3つのファイルがあります。
サーバーを実行していると、Firefoxは次の方法でページを要求できるようになります。
localhost:2222/server.c
問題は、Firefoxにserver.cの内容を表示する代わりに、ファイルがダウンロードされることです。(Firefoxはファイルを表示または保存するように促します。)index.htmlおよびclient.cと同じです。
server.cの内容を数日前にブラウザに表示することができました。しかし、ブラウザをそのように動作させるために行った変更を思い出せなくなりました。
これが私の変更を行っているコードスニペットです:
#define LINE_LEN 128
#define MAX_LEN 1024
...
int process_request(int fd, char *www_path) {
char cmessage[MAX_LEN];
char *r;
int n, read_size;
FILE *file;
char line[LINE_LEN];
struct stat sb;
if((n = read(fd, cmessage, MAX_LEN)) <= 0) {
return 6;
}
cmessage[n] = '\0';
// assume GET method
r = cmessage + 4;
n = 0;
while(r[n] != ' ') {
n++;
}
int len = strlen(www_path);
char req_file[len+n+1];
char temp[n+1];
strncpy(temp, r, n);
temp[n] = '\0';
sprintf(req_file, "%s%s", www_path, temp);
if(stat(req_file, &sb) == -1) {
perror("stat");
return 7;
}
char size[10];
sprintf(size, "%d", sb.st_size);
file = fopen(req_file, "rb");
write(fd, "HTTP/1.1 200 OK\r\nContent-length: ", 33);
write(fd, size, strlen(size));
write(fd, "\r\n\r\n", 4);
while((read_size = fread(line, sizeof(char), LINE_LEN, file)) != 0) {
write(fd, line, read_size);
}
fclose(file);
return 0;
}
それとも、これは私のWebブラウザの設定で設定できる単なる構成ですか?
詳細:
ソケットはを使用して作成されました
socket(AF_INET, SOCK_STREAM, 0);
listen()、bind()、およびaccept()は成功します。select()ステートメントは、読み取りの準備ができているファイル記述子を待機するために使用されます。接続されているクライアントのファイル記述子は、特定のファイル記述子へのread()が-1を返すまで閉じられません。
お時間を割いていただきありがとうございます。:-)なぜこれが起こっているのかについての有益な答えを期待しています。