1

ポート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を返すまで閉じられません。

お時間を割いていただきありがとうございます。:-)なぜこれが起こっているのかについての有益な答えを期待しています。

4

2 に答える 2

4

サーバーの応答の一部として、ブラウザーに適切なコンテンツタイプを指定する必要があります。これは、ハードコーディングするか、ファイル名から派生したものである可能性があります。例えば:

Content-Type: text/plain
于 2012-07-06T08:40:10.790 に答える
1

送信されるコンテンツのMIMEタイプを指定するContentTypeヘッダーを設定する必要があります。ブラウザは、コンテンツの種類ごとにコンテンツを扱います。

ブラウザがコンテンツタイプを識別できない場合、ユーザーにファイルを保存するように求めます。

write(fd, "\r\nContent-Type: text/html");

MIMEタイプは、送信するコンテンツによって異なります。index.htmlの場合はtext / htmlである必要があり、.cファイルの場合はtext/plainである可能性があります。

これとは別に、次のことがコードロジックに欠けていると感じます。

  • Content-Lengthはどのように導出されますか
  • HTTPプロトコルに従って、コンテンツはヘッダーの後に始まります。ヘッダーの終わりとコンテンツの開始をマークするには、2つの新しい行エントリが必要です。これはコンテンツとヘッダーの間の空白行です。
于 2012-07-06T08:41:09.073 に答える