我正在创建一个简单的服务器,它只在端口 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 之前,连接的客户端的文件描述符不会关闭。
感谢您抽出时间来阅读。:-) 希望对为什么会发生这种情况有一个有用的答案。