浏览器按原样显示HTML代码,由C程序写入套接字

时间:2016-02-10 17:57:06

标签: html c sockets http webserver

我有以下C程序,它将HTML语法中的文本写入端口5010。

HttpListener

然后我在浏览器的地址栏中发出以下请求:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h> 

int main(int argc, char *argv[])
{
    int listenfd = 0, connfd = 0;
    struct sockaddr_in serv_addr; 

    char* sendBuff="<html><head><title>page 1</title></head></html>";
    time_t ticks; 
    uint32_t ip = 0;
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    //memset(sendBuff, '0', sizeof(sendBuff)); 
    inet_aton("127.0.0.1", (struct in_addr*)&ip);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(ip);
    serv_addr.sin_port = htons(5010); 

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

    listen(listenfd, 10); 

    while(1)
    {
        connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 
    fprintf(stderr, "New connection \n");
        ticks = time(NULL);
        //snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
        write(connfd, sendBuff, strlen(sendBuff)); 

        close(connfd);
        sleep(1);
     }
}

我当时希望我的浏览器将页面标题显示为“page1”,而是将其呈现为HTML代码。 Browser Output

1 个答案:

答案 0 :(得分:4)

当您在浏览器栏中键入“127.0.0.1:5010”时,它会假定另一侧的服务器正在说出HTTP协议。您的浏览器会自动将您的网址更改为http://127.0.0.1:5010/。这意味着另一方的服务器必须使用有效的HTTP响应进行响应。

HTTP协议要求您传递的不仅仅是要显示的数据。例如,这是一个非常简单的网页的服务器响应:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Connection: close
Content-Length: 89

<!DOCTYPE html>
<html><head><title>page 1</title></head><body>Hello World!</body></html>

此外,您的浏览器无法知道将内容显示为HTML,除非您实际向其发送了具有适当值的Content-Type标头。

有关HTTP协议的更多详细信息,您可能需要阅读实际定义当前HTTP 1.1规范的corresponding Wikipedia article或以下6个RFC: