C 套接字:服务器为 Firefox 提供可下载文件,而不是 Firefox 显示页面

问题描述 投票:0回答:2

我正在创建一个简单的服务器,它除了在端口 2222 处提供现有文件 /home/john/www 之外什么也不做。我的 www 文件夹包含三个文件:index.html、server.c、client.c。

运行服务器,我的 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;
}

或者这只是可以在我的网络浏览器设置中设置的配置?

更多详情:

套接字是使用

创建的
socket(AF_INET, SOCK_STREAM, 0);

listen()、bind()、accept()成功。 select() 语句用于等待准备好读取的文件描述符。连接的客户端的文件描述符不会关闭,直到某个文件描述符的 read() 返回 -1。

c sockets firefox download posix-select
2个回答
4
投票

您需要为浏览器提供正确的“内容类型”作为服务器响应的一部分。这可能是您硬编码的内容,也可能是从文件名派生的内容。例如: Content-Type: text/plain



1
投票

如果浏览器无法识别内容类型,它会要求用户保存文件。

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

MIME 类型取决于您发送的内容,对于index.html,它应该是text/html,对于.c 文件,它可以是text/plain

除此之外,我觉得代码逻辑中缺少以下内容:

内容长度是如何得出的
  • 根据 HTTP 协议,内容在标头之后开始。要标记标题的结束和内容的开始,您应该有 2 个新行条目 - 即内容和标题之间的空行
© www.soinside.com 2019 - 2024. All rights reserved.