cgicc开发 (结合jsoncpp)

#include <iostream>
#include <fstream> //读写文件 c++标准库
#include <string> //字符串类 c++标准库
#include <sstream> //字符串流 c++标准库
#include <assert.h>
#include "json/json.h" //jsoncpp的头文件#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> using namespace cgicc;
using namespace std;
#define DEBUG false/********************* 测试模块 ********************/
void TestMode()
{Cgicc formData;		//加载Cgicc,获取Cgicc对象//获取 input标签 值const vector<cgicc::FormEntry>& form_entries = formData.getElements();	//getElements()函数,获取该from表单中全部 input标签cout << "form_entries.size()=" << form_entries.size() << endl;for (vector<cgicc::FormEntry>::size_type i=0; i<form_entries.size(); ++i){const cgicc::FormEntry& form_entry = form_entries[i];//打印每个 input标签 中 name属性 和 value属性值cout << "getName=" << form_entry.getName() << "; getValue=" << form_entry.getValue() << endl;}/*string name = formData("single_ip_type_ip");	//根据id获取其valuecout << "name=" << name << endl;form_iterator fi = formData.getElement("RadioGroup_Eth_Select");	//根据相同的name属性获取全部的radio对象if(!fi->isEmpty() && fi != (*formData).end())cout << "select eth:" << **fi << endl;elsecout << "no select." << endl;*/
}/********************* 写json文件 ********************/
/* 判断是否成功打开json文件 */
bool isReadJsonFileOk(const char *jsonFileName,Json::Value *jsonInfo)
{ifstream jsonFile(jsonFileName,ios::binary);if(!jsonFile.is_open()){
#if (DEBUG == true)cout << "OPEN " << jsonFileName << "ERROR" << endl;
#endifreturn false;}else{Json::Reader reader;if(reader.parse(jsonFile,*jsonInfo)){jsonFile.close();return true;}else{
#if (DEBUG == true)cout << "parse json ERROR." << endl;
#endifjsonFile.close();return false;}}return true;
}
/* 判断是否成功更新json文件 */
bool isWriteJsonFileOK(const char *jsonFileName,const Json::Value writeJson)
{ofstream jsonFile(jsonFileName,ios::out);if(!jsonFile.is_open()){
#if (DEBUG == true)cout << "OPEN " << jsonFileName << " ERROR." << endl;
#endifreturn false;}else{Json::StyledWriter sw;jsonFile << sw.write(writeJson);jsonFile.close();return true;}return true;
}
/* * 函数名: WriteSingleIpToJson: 将单ip配置写入json* 参数:* 	jsonFileName: json文件* 	select_eth_type: 网口类型选择* 	ip: IP地址*	subnet_mask: 子网掩码*  gateway: 默认网关*/
void WriteSingleIpToJson(const char *jsonFileName, int select_eth_type, string ip, string subnet_mask, string gateway)
{Json::Value jsonInfo;if(isReadJsonFileOk(jsonFileName, &jsonInfo) != true){
#if (DEBUG == true)cout << "write radio.josn file: open false." << endl;
#endifreturn;}//更新json文件jsonInfo["native"]["client_eth_choose"] = select_eth_type;jsonInfo["native"]["native_ip_address"] = ip;jsonInfo["native"]["native_subnet_mask"] = subnet_mask;jsonInfo["native"]["native_default_gateway"] = gateway;jsonInfo["native"]["client_type"] = 1;isWriteJsonFileOK(jsonFileName, jsonInfo);
}
/** WriteVipToJson: 将虚拟IP数据写入json* 参数:*	jsonFileName: json文件*	eth0_ip: eth0网口ip*	eth1_ip: eth1网口ip*	vip: 虚拟IP*  subnet_mask: 子网掩码*	gateway: 默认网关*/
void WriteVipToJson(const char *jsonFileName, string eth0_ip, string eth1_ip, string vip, string subnet_mask, string gateway)
{Json::Value jsonInfo;if(isReadJsonFileOk(jsonFileName, &jsonInfo) != true){
#if (DEBUG == true)cout << "write radio.json file: open false." << endl;
#endifreturn;}//更新json文件jsonInfo["native"]["native_ip_address"] = eth0_ip;jsonInfo["native"]["native_eth1_ip_address"] = eth1_ip;jsonInfo["native"]["native_vip_ip_address"] = vip;jsonInfo["native"]["native_subnet_mask"] = subnet_mask;jsonInfo["native"]["native_default_gateway"] = gateway;jsonInfo["native"]["client_type"] = 2;isWriteJsonFileOK(jsonFileName, jsonInfo);
}/******************* 提交单IP类型 *******************/
void SubmitSingleIpType()
{Cgicc formData;string single_ip_type_ip = formData("single_ip_type_ip");string single_ip_type_subnet_mask = formData("single_ip_type_subnet_mask");string single_ip_type_gateway = formData("single_ip_type_gateway");form_iterator fi = formData.getElement("RadioGroup_Eth_Select");string select_eth_name;int select_eth_value = 0;if(!fi->isEmpty() && fi != (*formData).end())select_eth_name = **fi;
#if (DEBUG == true)cout << "[single_ip_type] select_eth_name = " << select_eth_name<< "; ip = " << single_ip_type_ip << "; single_ip_type_subnet_mask = " << single_ip_type_subnet_mask<< "; single_ip_type_gateway = " << single_ip_type_gateway<< endl << endl;
#endifif(select_eth_name == "eth0")select_eth_value = 0;elseselect_eth_value = 1;WriteSingleIpToJson("/opt/conf/radio.json", select_eth_value, single_ip_type_ip, single_ip_type_subnet_mask, single_ip_type_gateway);
}/***************** 提交虚拟IP类型 *****************/
void SubmitVipType()
{Cgicc formData;string vip_type_eth0_ip = formData("vip_type_eth0_ip");string vip_type_eth1_ip = formData("vip_type_eth1_ip");string vip_type_vip = formData("vip_type_vip");string vip_type_subnet_mask = formData("vip_type_subnet_mask");string vip_type_gateway = formData("vip_type_gateway");
#if (DEBUG == true)cout << "[vip_type] vip_type_eth0_ip = " << vip_type_eth0_ip<< "; vip_type_eth1_ip = " << vip_type_eth1_ip << "; vip_type_vip = " << vip_type_vip<< "; vip_type_subnet_mask = " << vip_type_subnet_mask<< "; vip_type_gateway = " << vip_type_gateway<< endl << endl;
#endifWriteVipToJson("/opt/conf/radio.json", vip_type_eth0_ip, vip_type_eth1_ip, vip_type_vip, vip_type_subnet_mask, vip_type_gateway);
}/******************* main函数 *********************/
int main(int argc, char *argv[])
{cout << "Content-type:text/html;charset=utf-8\r\n\r\n";
#if (DEBUG == true)if(argc > 1){for(int i = 0; i < argc; i++){cout << "TIME SYN: argv[" << i << "]=" << argv[i] << endl;}}TestMode();
#endifstring submit_single_ip_type = "single_ip_type"; //提交"单IP"表单数据string submit_vip_type = "vip_type"; //提交"虚拟IP"表单数据if(argc > 1 && argv[1] == submit_single_ip_type){SubmitSingleIpType();}else if(argc > 1 && argv[1] == submit_vip_type){SubmitVipType();}#if (DEBUG == false)//cout << "<meta http-equiv=\"refresh\" content=\"0;url=../sjtb.html\">";//刷新当前页面cout << "<script>window.location.href = '../../wlsz.html';</script>\n";
#endifreturn 0;
}

 web通过 submit 提交form形式执行cgi程序。

cgicc的安装和使用,参考:Cgicc搭建交叉编译环境(移植到arm)-CSDN博客

jsoncpp的安装和使用,参考:CentOS7编译jsoncpp静态库_jsoncpp-master生成静态库-CSDN博客 

Jsoncpp搭建交叉编译环境(移植到arm)_json 移植到arm-CSDN博客 

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

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

相关文章

Java基础(37)XSS攻击、SQL注入攻击、CSRF攻击

XSS攻击&#xff08;跨站脚本攻击&#xff09; 定义&#xff1a;XSS&#xff08;Cross-Site Scripting&#xff09;攻击是指攻击者在目标网站上注入恶意的客户端脚本&#xff0c;当其他用户浏览该网站时&#xff0c;嵌入在网页中的这段脚本会被执行&#xff0c;从而达到攻击的…

<sa8650>QCX Usecase 使用详解—拓扑图 XML 定义

<sa8650>QCX Usecase 使用详解—拓扑图 XML 定义 一 、前言二、拓扑图 XML 定义2.1 <Node, port, link>2.2 < XML prolog >2.3 < UsecaseDef >2.4 < Usecase>2.5 < Targets>2.5.1 < Target>2.5.2 < Range>2.6 < Pipeline>2.…

C++之lambda【匿名函数】

1、语法 语法结构&#xff1a; [捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 {// 函数处理 }注意&#xff1a; 一般情况下&#xff0c;编译器可以自动推断出lambda表达式的返回类型&#xff0c;所以我们可以不指定返回类型。 但是如果函数体内有多个return语…

维修ABB示教器主板DSQC679 3HAC 033624-001 /R机器人液晶显示屏

ABB 全面的 6 轴关节型机器人产品组合为物料搬运、机器维护、点焊、弧焊、切割、组装、测试、检查、分配、研磨和抛光应用提供了理想的解决方案。 ABB 的协作机器人适用于各种规模的操作中的各种任务。它们易于设置、编程、操作和扩展。由行业领先的专家打造。并由业内最广泛的…

Nacos如何实现负载均衡?

作为一名资深的架构师&#xff0c;我深知在微服务架构中&#xff0c;负载均衡是确保系统高可用性、可扩展性和性能的关键技术之一。Nacos作为一款动态服务发现、配置和服务管理平台&#xff0c;为微服务架构中的负载均衡提供了强大的支持。接下来&#xff0c;我将结合我的实践经…

速盾:cdn加速技术原理

CDN&#xff08;Content Delivery Network&#xff09;加速技术是一种基于分布式部署的网络加速方案&#xff0c;旨在提高用户访问网页或者应用程序的响应速度和稳定性。它通过将内容缓存在离用户最近的边缘节点上&#xff0c;实现就近访问&#xff0c;从而减少了传输延迟和网络…

584. 寻找用户推荐人

584. 寻找用户推荐人 题目链接&#xff1a;584. 寻找用户推荐人 代码如下&#xff1a; # Write your MySQL query statement below select name from Customer where referee_id is null or referee_id<>2;

Mamba:7 VENI VIDI VICI

若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果构建生成级别的AI架构则可以关注AI架构设计。技术宅麻烦死磕LLM背后的基础模型。 序列模型的效率与有效性之间的权衡取决于状态编…

Android动画与视图绘制流程的关系

Android动画主要分为三种&#xff1a;帧动画、View动画&#xff08;补间动画&#xff09;、属性动画。每种动画的实现原理和它们与视图绘制流程&#xff08;测量、布局和绘制&#xff09;之间的关系如下&#xff1a; 1. 帧动画&#xff08;Frame Animation&#xff09; 帧动画…

实锤,阿里云盾会拦截百度云防护的IP!

今天凌晨&#xff0c;一位站长联系上云加速客服&#xff0c;反馈说&#xff0c;网站突然出现了502的情况。 在检查云防护子域名配置没有问题、本地强制回源没有问题的情况下&#xff0c;我们得出结论是要么服务器内防火墙拦截了云防护的IP段&#xff0c;要么服务器商拦截了云防…

分布式计算、并行计算、网格计算、边缘计算

分布式计算 分布式计算是一种计算方法&#xff0c;它将一个大型的计算任务分解成多个子任务&#xff0c;并将这些子任务分布在网络上的多台计算机&#xff08;节点&#xff09;上同时执行。这些节点通过通信网络协同工作&#xff0c;共同完成任务。每个节点可以独立处理自己的…

[muduo网络库]——muduo库EventLoopThread类(剖析muduo网络库核心部分、设计思想)

接着之前我们[muduo网络库]——muduo库Thread类&#xff08;剖析muduo网络库核心部分、设计思想&#xff09;&#xff0c;我们接下来继续看muduo库中的EventLoopThread类&#xff0c;它和Thread类息息相关。 EventLoopThread类 封装了eventloop线程也就是IO线程&#xff0c;e…

如何使用AzurEnum快速枚举Microsoft Entra ID(Azure AD)

AzurEnum是一款针对Azure的安全工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松快速地枚举Microsoft Entra ID&#xff08;Azure AD&#xff09;。 该工具基于纯Python 3开发&#xff0c;可以在Windows和Linux系统上运行&#xff0c;但考虑到性能和稳定性&a…

CSS字体修饰

1&#xff09;文字大小 &#xff08; font-size &#xff09; /* 设置文字大小为24个像素 */ font-size: 24px; 2&#xff09;字体粗细 &#xff08; font-weight &#xff09; /* 字体粗细在100-900之间可以进行调整 */ /* 字体加粗 */ font-weight: bolder; /* 或 fon…

FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid

XviD是个开源的视频编解码器&#xff0c;它与DivX一同被纳入MPEG-4规范第二部分的视频标准&#xff0c;但DivX并未开源。早期的MP4视频大多采用XviD或者DivX编码&#xff0c;当时的视频格式被称作MPEG-4。现在常见的H.264后来才增补到MPEG-4规范的第十部分&#xff0c;当然如今…

远程桌面如何配置?使用快解析远程访问

远程桌面如何设置&#xff1f; 远程桌面作为windows系统内置的一个组件&#xff0c;多年来深受用户喜爱。使用此功能&#xff0c;我们能够轻而易举的控制我们想要控制的电脑。下面我就简单的介绍一下远程桌面的设置方法。 在讲具体设置方法之前&#xff0c;首先应该给大家普及…

dfs记忆化搜索,动态规划

动态规划概念&#xff1a; 给定一个问题&#xff0c;将其拆成一个个子问题&#xff0c;直到子问题可以直接解决。然后把子问题的答案保存起来&#xff0c;以减少重复计算。再根据子问题的答案反推&#xff0c;得出原问题解。 821 运行时间长的原因&#xff1a; 重复大量计算…

pytorch-11 神经网络的学习

一、梯度下降中的两个关键问题 1 找出梯度向量的方向和大小 2 让坐标点移动起来(进行一次迭代) 二、找出距离和方向:反向传播 1 反向传播的定义与价值 我们是从左向右,从输出向输入,逐渐往前求解导数的表达式,并且我们所使用的节点上的张量,也是从后向前逐渐用到,…

Oracle通过触发器实现自增长字段

在Oracle数据库中&#xff0c;没有像SQL Server中的IDENTITY或MySQL中的AUTO_INCREMENT这样的直接方式来为表中的字段实现自增长功能。但是&#xff0c;你可以使用序列&#xff08;Sequence&#xff09;和触发器&#xff08;Trigger&#xff09;的组合来实现类似的功能。 以下是…

MLM之GPT-4o:GPT-4o(多模态/高智能/2倍速/视觉改进/128K的大窗口)的简介、安装和使用方法、案例应用之详细攻略

MLM之GPT-4o&#xff1a;GPT-4o(多模态/高智能/2倍速/视觉改进/128K的大窗口)的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年5月13日&#xff0c;OpenAI重磅发布新旗舰模型GPT-4o&#xff0c;这是一个全新的旗舰模型&#xff0c;可以实时跨越音频、视觉和…