编程实战:自己编写HTTP服务器(系列6:调用用户功能)

 系列入口:编程实战:自己编写HTTP服务器(系列1:概述和应答)-CSDN博客

         本文讲解如何将原有C++代码接入到WEB服务里。

目录

一、概述

二、框架入口

三、执行用户功能

3.1 代码

3.2 入口参数

3.3 系统检查和初始化

3.4 执行

四、接口


一、概述

        做嵌入式服务器的主要目的当然不是提供静态文件,而是将程序里的功能和浏览器结合起来,让浏览器成为程序的用户界面。用浏览器直接调用程序功能显然比查日志文件或者数据库友好多了。用浏览器直接操作程序也比修改配置文件再重启程序方便很多倍。

        命令接口最基础的就是一个函数指针或者虚函数,提前配置好函数指针或虚函数,框架只需要调用函数指针或虚函数即可。主要的工作是制定合理的输入输出参数。

二、框架入口

        框架中根据请求的资源目录和扩展名来确定是否是用户功能:

        从上面的代码可以看出来,资源是“/bin/”或者“/admin/”目录(虚拟目录)下的就执行用户功能。扩展名为“asp”、“aspx”、“asmx”的当作内置页面(显然这是我在模仿IIS,这些后缀名与它们通常的意义毫无关系),其余当作CGI,当然了CGI已经没人写了,所以可以无视。

        doPageFunction()的代码是这样的:

        首先查找了命令, 然后根据命令的属性做了一些区别,实质的执行代码是_doPageFunction()。如果有错误就返回404或500。

        其余代码不用关心。你当然也会在自己的程序里加入很多特定功能。

三、执行用户功能

3.1 代码

		bool _doPageFunction(web_command_private_struce * pCmdInfo)
		{
			long i_cmd = pCmdInfo->seq;
			CWebCommand * pCmd = pCmdInfo->pWebCommand;
			//处理用户系统内部检查
			string err;
			if (NULL != this->pfCheckSys && !pfCheckSys(err))
			{
				//用户系统检查未通过,不执行用户函数
				OnPageStart("500 Internal Server Error");
				m_respond.AppendBody(CHtmlDoc::HTMLEncode(err));
				OnPageEnd();
				return false;
			}

			++m_pServerDatas->m_web_command_data_s[i_cmd].count;//执行计数

			if (!pCmdInfo->isInited)
			{
				if (!pCmd->InitWebFunction())
				{
					LOG << pCmd->command_id << " 初始化失败" << ENDE;
					OnPageStart("500 Internal Server Error");
					m_respond.AppendBody(CHtmlDoc::HTMLEncode(err));
					OnPageEnd();
					return false;
				}
				else
				{
					LOG << pCmd->command_id << " 初始化成功" << ENDI;
					pCmdInfo->isInited = true;
				}
			}

			if (pCmd->NotStdPage)
			{
				if (!pCmd->doWebFunction(&this->m_request, this->m_s, &this->m_respond))
				{
					++m_pServerDatas->m_web_command_data_s[i_cmd].count_err;//出错计数
				}
			}
			else
			{
				//文件头
				OnPageStart(pCmd->name.c_str());
				LOG << "发送应答头" << ENDI;
				if (!m_respond.Flush(m_s))return true;

				if (!CallCommand(pCmd))
				{
					++m_pServerDatas->m_web_command_data_s[i_cmd].count_err;//出错计数
				}

				//文件尾
				m_respond.AppendBody("<P><HR></HR>");
				m_respond.AppendBody(pCmd->name);
				m_respond.AppendBody("<BR>");
				m_respond.AppendBody(pCmd->note);
				m_respond.AppendBody("<BR>");
				if (!pCmd->hide)
				{
					pCmd->SetParamValueFromRequest(m_request);
					m_respond.AppendBody(pCmd->toHtmlFormInput(false, false, &m_request));
					m_respond.AppendBody("<INPUT TYPE=\"hidden\" NAME=\"autorefresh\" >\n");
					m_respond.AppendBody(pCmd->toHtmlFormSubmit(true));

					if (pCmd->AutoRefresh)
					{
						char buf2[2048];
						bool isAutoRefresh = (m_request.GetParam("autorefresh") == "true");
						long refreshtimeout = atol(m_request.GetParam("refreshtimeout").c_str());
						if (refreshtimeout <= 0)refreshtimeout = 10;
						sprintf(buf2,
							"<BUTTON NAME=\"autorefresh\" onclick=\"timer=setTimeout('window.%s.submit()',%ld);window.%s.autorefresh.value='true';window.autorefresh.disabled=true;window.stoprefresh.disabled=false;\">自动刷新</BUTTON>\n"
							"<button NAME=\"stoprefresh\" disabled onclick=\"clearTimeout(timer);window.%s.autorefresh.value='';window.autorefresh.disabled=false;window.stoprefresh.disabled=true;\">停止刷新</BUTTON><BR>\n"
							"%s<BR>\n"
							, pCmd->GetFormName().c_str(), refreshtimeout * 1000, pCmd->GetFormName().c_str(), pCmd->GetFormName().c_str(), (isAutoRefresh ? "<script language=\"JavaScript\">window.autorefresh.onclick()</script>" : ""));
						m_respond.AppendBody(buf2);
					}
				}
				OnPageEnd();
			}
			return true;
		}

3.2 入口参数

        入口参数web_command_private_struce里面主要就是接口对象,一个函数指针或者虚函数。

        请求对象和应答对象都是类成员,在类里面可以随时使用,但是用户功能是外部的,所以要在调用时作为参数传递。

3.3 系统检查和初始化

        调用外部功之前执行了外部提供的系统检查pfCheckSys,如果失败就不能执行用户功能。

        每个用户功能可能需要初始化。所以第一调用要先初始化。

        如果功能够简单,这两步都可以忽略。

3.4 执行

        执行分两种,一种是嵌入在标准HTML页面里面,用户功能只提供主体输出,另一种是用户功能完全控制输出(比如一张动态刷新页面内容的无限网页,后面我会介绍如何实现)。

        标准页面由框架生成HTML的首尾部分,可以具有相同的辅助功能,中间调用CallCommand输出内容,纯自定义输出则执行“pCmd->doWebFunction(&this->m_request, this->m_s, &this->m_respond)”,CallCommand其实也是执行这个,只不过略加一点控制。

        剩下的核心就是doWebFunction了。

四、接口

        待续。

(这里是结束,但不是整个系列的结束)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

消息队列kafka详解:Kafka重要知识点+面试题大全

重要面试知识点 Kafka 消费端确保一个 Partition 在一个消费者组内只能被一个消费者消费。这句话改怎么理解呢&#xff1f; 在同一个消费者组内&#xff0c;一个 Partition 只能被一个消费者消费。 在同一个消费者组内&#xff0c;所有消费者组合起来必定可以消费一个 Topic 下…

【flutter对抗】blutter使用+ACTF习题

最新的能很好反编译flutter程序的项目 1、安装 git clone https://github.com/worawit/blutter --depth1​ 然后我直接将对应的两个压缩包下载下来&#xff08;通过浏览器手动下载&#xff09; 不再通过python的代码来下载&#xff0c;之前一直卡在这个地方。 如果读者可以…

npm安装

node 设置配置之后&#xff0c;要查询时&#xff0c;会从.npmrc中读取路径 .npmrc自己创建的&#xff08;默认情况下.npmrc会创建在C盘中&#xff09; 自己创建的在D:\studay-and-working\node16.14\node_modules\npm中 指定.npmrc文件&#xff0c;因为默认会访问C盘的.npmrc文…

在Windows系统和Linux系统中MongoDB的安装方法

本文主要介绍在Windows系统和Linux系统中MongoDB的安装方法。 目录 Windows系统中安装MongoDBLinux系统中安装MongoDB Windows系统中安装MongoDB 在Windows系统中安装MongoDB&#xff0c;可以分为以下几个步骤&#xff1a; 下载MongoDB安装包 在MongoDB官网上下载Windows系统下…

【Linux学习】深入理解动态库与静态库

目录 十三.动态库与静态库 13.1 认识动静态库 13.2 深入理解动静态库 什么是库? 编译链接过程 动静态库的基本原理 13.3 静态库 静态库的打包: 静态库的使用: 13.4 动态库 动态库的打包: 动态库的使用: 13.5 动态库与静态库怎么选? 十三.动态库与静态库 13.1 认识动静态库 …

Vue 中 v-model 的修饰符

lazy 修饰符&#xff1a;将 v-model 改为失去焦点后更新数据。 number 修饰符&#xff1a;将 v-model 数据转为数字类型。 trim 修饰符&#xff1a;去除 v-model 数据中的首尾空格。 语法格式&#xff1a; // lazy 修饰符 <input v-model.lazy"数据"> // nu…

ArcGIS pro与SuperMap根据属性自动填充颜色步骤

GIS项目经常会接触到控规CAD数据&#xff0c;想要把数据转换成GIS图层并发布&#xff0c;需要进行专题配图。研究了一下ArcGIS pro和SuperMap iDesktop的配图&#xff0c;整理一下用到的一些技术思路。 1、Excel表格根据RGB值添加单元格填充颜色 要实现如上效果图&#xff0c;…

AI创新之美:AIGC探讨2024年春晚吉祥物龙辰辰的AI绘画之独特观点

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《linux深造日志》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、龙辰辰事件概述二、为什么龙辰辰会被质疑AI创作&#xff1f;1.1 AI 作画的特点2.2 关于建行的合作宣传图…

如何利用宝塔面板和docker快速部署网站

当你有了一台服务器&#xff0c;就会折腾往这台服务器上部署各种好玩的网站。市面上有许多开源的网站项目&#xff0c;通过docker技术可以快速部署并使用&#xff0c;本文将以部署filebrowser举例介绍网站部署的基本流程。 1. 安装宝塔面板 宝塔面板是一款开源的网站运维工具…

博客内容和多种搜索友好格式在 2024 年的作用

内容和SEO之间一直存在着密切的联系。 今天&#xff0c;我想分享一些关于博客、内容和搜索友好格式的想法和技巧。此外&#xff0c;我将分享有关生成式人工智能如何为这种关系添加新元素的见解。 谷歌最近关于有用和有价值的内容的更新重新引发了关于如何找到内容以及内容排名…

汽车销售技巧培训应该学习哪些内容

汽车销售技巧培训应该学习哪些内容 随着汽车市场的竞争日益激烈&#xff0c;汽车销售技巧培训对于提高销售人员的销售能力和服务水平至关重要。本文将介绍汽车销售技巧培训应该学习哪些内容&#xff0c;并结合案例进行分析。 一、产品知识 作为销售人员&#xff0c;了解所销售…

用户管理第2节课 -- idea 2023.2 创建表

一、懂得 1.1编码格式是防止乱码的&#xff0c;utf-8是完全够的&#xff0c;那几个基本没差别 网址&#xff1a; 【IDEA——连接MySQL数据库&#xff0c;创建库和表】_idea中数据库-CSDN博客 这些是MySQL数据库中的一些术语&#xff0c;可以简单解释如下&#xff1a; 1、col…

【日积月累】Spring中的AOP与IOC相关问题详解

Spring中的AOP与IOC 1.前言2.Spring AOP&#xff08;面向切面编程&#xff09;2.1 AOP的实现过程2.2 AOP代理模式的类型2.2.1JDK的动态代理2.2.2CGLIB的动态代理 2.3AOP应用常见场景2.3.1日志记录 2.4对AOP的理解 3.Spring IOC&#xff08;Inversion of Control&#xff0c;控…

低代码平台解密:探秘MQTT协议的应用之道

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 低代码平台作为当今快速发展的技术之一&#xff0c;为开发人员提供了更高效、更简便的工具和方法&#xff0c;以…

深度解读 Cascades 查询优化器

数据库中查询优化器是数据库的核心组件&#xff0c;其决定着 SQL 查询的性能。Cascades 优化器是 Goetz 在 volcano optimizer generator 的基础上优化之后诞生的一个搜索框架。 本期技术贴将带大家了解 Cascades 查询优化器。首先介绍 SQL 查询优化器&#xff0c;接着分析查询…

【玩转TableAgent数据智能分析】TableAgent全功能详解及多领域数据分析实践(下)数据分析过程及总结展望

6 TableAgent的数据分析过程解析 TableAgent的整个分析过程包括以下步骤&#xff0c;形成一个有机结构&#xff0c;让我们理清其工作原理。 6.1 Data Graph阶段 TableAgent首先绘制数据图&#xff0c;以解决问题。这个图形表示了问题的分解和细化&#xff0c;将大问题分解成…

git强制回滚,远程强制更新,git pull强制更新

注意&#xff1a;这里是强制回滚&#xff0c;回滚后&#xff0c;之后历史的就没有了&#xff0c;慎用。 本地强制回滚 强制回滚到上一个版本 git reset --hard HEAD^强制回滚上上个版本 git reset --hard HEAD^^git log查看版本 git log --prettyonelinegit log --prettyf…

【网络安全】HTTP Slowloris攻击原理解析

文章目录 Slowloris攻击的概念Slowloris攻击原理Slowloris攻击的步骤其他的DDoS攻击类型UDP FloodICMP (Ping) FloodSYN FloodPing of DeathNTP AmplificationHTTP FloodZero-day DDoS 攻击 推荐阅读 Slowloris攻击的概念 Slowloris是在2009年由著名Web安全专家RSnake提出的一…

指定安装nginx版本链接

Index of /packages/centos/7/x86_64/RPMS/ (nginx.org) 找到想要下载的对应版本直接下载 rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.24.0-1.el7.ngx.x86_64.rpm 查看nginx信息 rpm -qa nginx rpm -qi nginx 命令rpm -ivh是Linux系统中的一种用于…

折腾了一下Atmega64A(开发环境搭建+程序下载)

半路接了一个项目&#xff0c;使用的mcu是atmega64a&#xff0c;在我印象中这种古老芯片都要淘汰了&#xff0c;没想到还有人在使用。 程序是用的ICCV7 for AVR开发的&#xff0c;在网上找到这个IDE&#xff0c;win10下安装还算顺利&#xff0c;这个软件的最新版本是7.22&#…