• C语言-写一个简单的Web服务器(三)


    上次我们研究了如何将解析web前端的请求,本次内容里我们将服务器的内容响应到前端,让浏览器展示。

    响应数据到前端

    服务器将数据响应到前端有其必要的返回数据,其结构如下,中间\r\n为换行,这个在不同系统(window,linux)不同,暂时将其作为一种固定格式。
    在这里插入代码片
    “HTTP/1.0 200 OK\r\n”
    “Server: my-AI-X v1.0\r\n”
    “Content-Type: text/html;charset=utf-8\r\n”
    “\r\n”

    定义响应头(header)

    const char headers[] = "HTTP/1.0 200 OK\r\n"
                           "Server: my-AI-X v1.0\r\n"
                           "Content-Type: text/html;charset=utf-8\r\n"
                           "\r\n";
     //定义HTML页面的标签部分内容,可以根据自己的需求替换
    const char html_header[] = "AI content";
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    响应回前端的数据

    定义了一个函数,从服务器读取html模板中的内容,将其返回给前端。

    读取项目html模板
    /**
     *  定义读取html模板的函数,此处会用到文件解析
     */
    void read_html(char *file_buff);
    void read_html(char *file_buff) {
        FILE *fp = NULL;
    
        fp = fopen("D:/cprojects/ai_x/mychat.html", "r"); //html文件的绝对路径
    
        int step = 0;
        int c = 0;
        while ((c = fgetc(fp)) != EOF) {
        	//处理文件中出现回车和换行
            if (c == '\r' || c == '\n' ) {
                continue;
            }
            file_buff[step++] = (char) c;
        }
        file_buff[step + 1] = '\0';
        fclose(fp);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    将登录用户名写入html中

    定义一个函数,拼接用户名到第二个页面的输出中。

    image-20240308174053262

    char * sub_str= strtok(file_buff,"PPP");   //找到html的"PPP"标记
    char body[BODY_SIZE];
    memset(body,0, sizeof(body));
    
    strcpy(body, sub_str);
    strcat(body, username);
    sub_str = strtok(NULL,"PPP");
    strcat(body, sub_str);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    响应前端

    响应到前端,其实质上是指将数据发送到浏览器,要调用send()函数完成此操作。

    send(client_socket, headers, strlen(headers), 0);
    send(client_socket, html_header, strlen(html_header), 0);
    send(client_socket, body, strlen(body), 0);
    
    fclose(fp);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    完整代码

     char file_buff[1024];
     memset(file_buff, 0, strlen(file_buff));
     read_html(file_buff);  //读取html模板
     printf("[服务器] 解析文件=>[%s]\n", "mychat.html");
    
     char *sub_str = strtok(file_buff, "PPP"); 
     char body[BODY_SIZE];
     memset(body, 0, sizeof(body));
    
     strcpy(body, sub_str);
     strcat(body, username);
     sub_str = strtok(NULL, "PPP");
     strcat(body, sub_str); //替换PPP位置的内容为用户名
     send(client_socket, headers, strlen(headers), 0);
     send(client_socket, html_header, strlen(html_header), 0);
     send(client_socket, body, strlen(body), 0);  
     printf("[服务器] 响应完成......\n");
    
     close(client_socket);
     printf("[服务器] ---------------断开与客户端(浏览器的连接)------------------\n\n");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    C语言“牵手”拼多多商品详情数据方法,拼多多商品详情API接口,拼多多API申请指南
    CnosDB有主复制演进历程
    Cell:代谢组学肠道微生物群介导生酮饮食的抗癫痫作用
    C语言-操作符详解
    [NOIP2001 普及组] 最大公约数和最小公倍数问题
    Gauss数据库redo日志
    独立站卖家在哪些平台做社交媒体营销效果最好?
    跳跃游戏----题解报告
    java计算机毕业设计线上竞赛训练系统录屏源程序+mysql+系统+lw文档+远程调试
    独立站建站实操:斗篷使用、AB收款【FP商家不能错过】
  • 原文地址:https://blog.csdn.net/qq_36115196/article/details/136745808