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

响应回前端的数据

定义了一个函数,从服务器读取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);
}
将登录用户名写入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);
响应前端

响应到前端,其实质上是指将数据发送到浏览器,要调用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);

完整代码

 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");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/541892.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLiteC/C++接口详细介绍之sqlite3类(九)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;八&#xff09; 下一篇&#xff1a;​​SQLiteC/C接口详细介绍之sqlite3类&#xff08;十&#xff09;&#xff08;未发表&#xff09;​​​​ 27…

Windows蓝牙驱动开发之模拟HID设备(一)(把Windows电脑模拟成蓝牙鼠标和蓝牙键盘等设备)

by fanxiushu 2024-03-14 转载或引用请注明原作者 把Windows电脑模拟成蓝牙鼠标和蓝牙键盘&#xff0c;简单的说&#xff0c;就是把笨重的PC电脑当成鼠标键盘来使用。 这应该是一个挺小众的应用&#xff0c;但有时感觉也应该算比较好玩吧&#xff0c; 毕竟实现一种一般人都感觉…

【贪心算法】Leetcode 55. 跳跃游戏

【贪心算法】Leetcode 55. 跳跃游戏 解法1解法2 ---------------&#x1f388;&#x1f388;55. 跳跃游戏 题目链接&#x1f388;&#x1f388;------------------- 解法1 关键点在于&#xff1a;不用拘泥于每次究竟跳几步&#xff0c;而是看覆盖范围&#xff0c;覆盖范围内…

数据仓库的设计开发应用(二)

目录 四、数据仓库的设计&#xff08;一&#xff09;需求分析&#xff08;二&#xff09;概念设计&#xff08;三&#xff09;逻辑设计&#xff08;四&#xff09;物理设计 四、数据仓库的设计 数据仓库的设计包括需求分析、概念设计、逻辑设计和物理设计四个阶段&#xff0c;其…

【每日一问】手机如何开启USB调试?

一、背景 当电脑跟手机之间需要进行交互的时候&#xff0c;可以考虑使用usb进行连接。那么手机如何开启USB调试呢&#xff1f; 二、操作步骤&#xff1a; 思路&#xff1a; 步骤1&#xff1a;手机开启开发者模式 步骤2&#xff1a;在开发者模式中&#xff0c;开启“USB调试”…

怎样提升小程序日活?签到抽奖可行吗?

一、 日活运营策略 小程序应该是即用即走的&#xff0c;每个小程序都在用户中有自己的独特定位&#xff0c;可能是生活日常必备&#xff08;美食、团购、商城&#xff09;&#xff0c;也可能是工作办公必备&#xff08;文档、打卡、工具&#xff09;。 如果你想要让自己的小程…

python 最相似折线 简化重定向

目录 计算两个相似折现 效果: 计算两个相似折现 import numpy as np from scipy.optimize import minimize import cv2# 定义一个函数来计算两个骨骼之间的距离总和 def similarity(angles):# 重构骨骼 Bskeleton_B = [start_point_B]for i, angle in enumerate(angles):dir…

每日五道java面试题之springMVC篇(三)

目录&#xff1a; 第一题. Controller注解的作用第二题. RequestMapping注解的作用第三题. ResponseBody注解的作用第四题. PathVariable和RequestParam的区别第五题. Spring MVC与Struts2区别 第一题. Controller注解的作用 在Spring MVC 中&#xff0c;控制器Controller 负责…

【AI】创建自己的基于会话的自定义模型的ChatGPT

【AI】创建自己的基于会话的自定义模型的ChatGPT 目录 【AI】创建自己的基于会话的自定义模型的ChatGPT开篇功能设计步骤详解1. 爬取Web数据2. 拆分文档3. 创建向量嵌入4. 将向量嵌入存储在Chroma中5. 用户提出问题6. 创建提问的向量嵌入7. 语义搜索向量数据库8. 生成提示9. 提…

机器学习库Scikit-Learn

Scikit-Learn是Python下强大的机器学习工具包&#xff0c;它提供了完善的机器学习工具箱&#xff0c;包括数据预处理、分类、回归聚类、预测和模型分析等。 Scikit-Learn 依赖于NumPy、SciPy和 Matplotlib&#xff0c;因此&#xff0c;只需要提前安装好这几个库然后安装 Scikit…

逻辑数据平台的 NoETL 之道(内含QA)

作者简介&#xff1a; 余俊&#xff0c;Aloudata 合伙人 & 技术副总裁。拥有 18 年互联网技术和大数据平台相关架构经验。作为主架构师及核心研发主导并完成了 Alibaba B2B 首个海量分布式 KV 存储系统&#xff0c;作为网站架构师负责 Aliexpress 全球买全球卖交易系统的第…

【XR806开发板试用】基于WEBSOCKET实现人机交互(控制开关灯)以及开发问题记录

一、开发板编译、功能介绍 根据官方文档编译烧录成功后&#xff0c;我们修改下官方例子&#xff0c;进行开发来实现websocket。 整体流程&#xff1a;开发板先自动寻找指定的wifi并且连接&#xff0c;连接成功后&#xff0c;通过websocket来与服务端连接&#xff0c;连接成功后…