为什么在此Web服务器示例中需要额外的\ r \ n?

时间:2014-04-24 16:02:20

标签: sockets

所以我正在阅读这本名为Hacking:The Explo of Exploitation的书,我正在使用它的Tinyweb Server示例。

代码段如下:

fd = open(resource, O_RDONLY, 0); //Try to open file
printf("\tOpening \'%s\'\t",resource);
if(fd==-1){ //File not found
    printf(" 404 Not found:\n");
    send_string(sockfd, "HTTP/1.0 404 NOT FOUND\r\n");
    send_string(sockfd, "Server: Tiny webserver\r\n\r\n");
    send_string(sockfd, "<html><head><title>404 Not Found</title></head>");
    send_string(sockfd, "<body><h1>URL not found</h1></body></html>\r\n");
} else { //Otherwise, serve up the file 
...

那么,为什么在第二个send_string调用中需要额外的\ r \ n?没有它(比如说你取消注释整行),浏览器只会尝试无限加载。

我还注意到,如果取消注释前两个send_string调用,页面加载就好了。你也可以对此发表评论吗?

2 个答案:

答案 0 :(得分:2)

HTTP响应的格式为:

  1. 回复标题
  2. 空行
  3. 回应正文
  4. 你需要空白行来告诉标题结束和身体开始的位置。

答案 1 :(得分:1)

您需要两个\r\n来告诉浏览器没有更多标题。 http://en.wikipedia.org/wiki/List_of_HTTP_header_fields