C套接字:服务器给firefox一个可下载的文件,而不是firefox显示页面
我正在创建一个简单的服务器,它除了在2222端口提供一个现有的文件/home/john/www之外,什么也不做。我的www文件夹有三个文件:index.html、server.c、client.c 运行服务器后,我的firefox现在可以通过以下方式请求页面:C套接字:服务器给firefox一个可下载的文件,而不是firefox显示页面,c,sockets,firefox,select,download,C,Sockets,Firefox,Select,Download,我正在创建一个简单的服务器,它除了在2222端口提供一个现有的文件/home/john/www之外,什么也不做。我的www文件夹有三个文件:index.html、server.c、client.c 运行服务器后,我的firefox现在可以通过以下方式请求页面: localhost:2222/server.c 问题是,我的firefox没有显示server.c的内容,而是下载了该文件。firefox提示查看或保存文件。与index.html和client.c相同 几天前,我能够在浏览器上显示se
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;
}
倾听、绑定和接受都是成功的。select语句用于等待准备读取的文件描述符。在对某个文件描述符的读取返回-1之前,连接的客户端的文件描述符不会关闭
感谢您抽出时间阅读本文-
希望得到一个有用的答案来解释为什么会发生这种情况。您需要在服务器的响应中为浏览器提供一个合适的选项。这可能是您硬编码的内容,也可能是从文件名派生的内容。例如:
Content-Type: text/plain
作为服务器响应的一部分,您需要为浏览器提供一个适当的响应。这可能是您硬编码的内容,也可能是从文件名派生的内容。例如:
Content-Type: text/plain
您应该设置Content Type标头,该标头将指定要发送的内容的MIME类型。浏览器按内容类型处理内容 如果浏览器无法识别内容类型,它将要求用户保存文件
write(fd, "\r\nContent-Type: text/html");
MIME类型取决于您发送的内容,对于index.html,它应该是text/html;对于.c文件,它可以是text/plain
除此之外,我觉得代码逻辑中缺少以下内容:
内容长度是如何导出的
根据HTTP协议,内容在头之后开始。要标记标题的结束和内容的开始,您应该有两个新行条目-即内容和标题之间的空行
您应该设置Content Type标头,该标头将指定要发送的内容的MIME类型。浏览器按内容类型处理内容 如果浏览器无法识别内容类型,它将要求用户保存文件
write(fd, "\r\nContent-Type: text/html");
MIME类型取决于您发送的内容,对于index.html,它应该是text/html;对于.c文件,它可以是text/plain
除此之外,我觉得代码逻辑中缺少以下内容:
内容长度是如何导出的
根据HTTP协议,内容在头之后开始。要标记标题的结束和内容的开始,您应该有两个新行条目-即内容和标题之间的空行
谢谢你放松。我将尝试在标题中包含此内容。不过,这让我想知道为什么几天前它还没有指定内容类型。有什么想法吗?再次感谢你,谢谢你放松。我将尝试在标题中包含此内容。不过,这让我想知道为什么几天前它还没有指定内容类型。有什么想法吗?再次感谢。@t伯特:为什么这么消极?这是学习如何使用套接字的好方法。您无需实现整个HTTP/1.1协议即可完成此操作。@Pedro那么OP在尝试一个他明确不支持的操作时,不应感到惊讶或不知所措。@tbert:您的评论是以何种方式建设性的,例如,你是如何为他指出正确的方向的?@Pedro我希望在不久的将来,对OP解决问题能力的有针对性的批评会促使他在不久的将来提高这些技能。@tbert:为什么这么消极?这是学习如何使用套接字的好方法。您无需实现整个HTTP/1.1协议即可完成此操作。@Pedro那么OP在尝试一个他明确不支持的操作时,不应感到惊讶或不知所措。@tbert:您的评论是以何种方式建设性的,例如,你是如何为他指出正确的方向的?@Pedro我希望在不久的将来,对OP解决问题能力的有针对性的批评会促使他改进这些技能。