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

标签 html c sockets http webserver

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

#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);
     }
}

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

127.0.0.1:5010

我原本希望我的浏览器将页面标题显示为“page1”,但它却按原样呈现了 HTML 代码。 Browser Output

最佳答案

当您在浏览器栏中输入“127.0.0.1:5010”时,它假定另一端的服务器使用 HTTP 协议(protocol)。您的浏览器会自动将您的 URL 更改为 http://127.0.0.1:5010/。这意味着另一端的服务器必须响应有效的 HTTP 响应。

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

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 header 。

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

关于html - 浏览器按原样显示由 C 程序写入套接字的 HTML 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35322551/

相关文章:

html - 滚动到达特定点时进行 Angular 检测

javascript - JQuery 值未保存?

javascript - 通过菜单按钮滚动时 JavaScript 出现问题

c - 当涉及功能时,结构、 union 等的范围如何工作?

c - 函数内绑定(bind)和函数外绑定(bind)的区别

c# - 在 C# 中使用 IP 协议(protocol)上的原始套接字读取传入数据包

python - BeautifulSoup 找不到标签 li

c - mmap() 返回未在函数之间传递

c++ - 如何重启套接字程序?

python - C 和 Python 中的套接字