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)

c 复制代码
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页面的<head>标签部分内容,可以根据自己的需求替换
const char html_header[] = "<head><title>AI content</title></head>";

响应回前端的数据

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

读取项目html模板
c 复制代码
/**
 *  定义读取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);
}
将登录用户名写入html中

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

c 复制代码
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);
响应前端

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

c 复制代码
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);

完整代码

c 复制代码
 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");
相关推荐
草莓熊Lotso1 小时前
【数据结构初阶】--二叉树(二)
c语言·数据结构·经验分享·其他
paopaokaka_luck2 小时前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
患得患失9493 小时前
【前端】【vscode】【.vscode/settings.json】为单个项目配置自动格式化和开发环境
前端·vscode·json
飛_3 小时前
解决VSCode无法加载Json架构问题
java·服务器·前端
YGY Webgis糕手之路5 小时前
OpenLayers 综合案例-轨迹回放
前端·经验分享·笔记·vue·web
90后的晨仔6 小时前
🚨XSS 攻击全解:什么是跨站脚本攻击?前端如何防御?
前端·vue.js
Ares-Wang6 小时前
JavaScript》》JS》 Var、Let、Const 大总结
开发语言·前端·javascript
90后的晨仔6 小时前
Vue 模板语法完全指南:从插值表达式到动态指令,彻底搞懂 Vue 模板语言
前端·vue.js
德育处主任6 小时前
p5.js 正方形square的基础用法
前端·数据可视化·canvas
烛阴6 小时前
Mix - Bilinear Interpolation
前端·webgl