当前位置: 首页 > news >正文

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博客 

相关文章:

cgicc开发 (结合jsoncpp)

#include <iostream> #include <fstream> //读写文件 c标准库 #include <string> //字符串类 c标准库 #include <sstream> //字符串流 c标准库 #include <assert.h> #include "json/json.h" //jsoncpp的头文件#include <cgicc/CgiD…...

HTML常用标签及属性

一、简单标签 标签作用div 自带换行&#xff0c;块级显示span 语义化标签&#xff0c;无任何修饰效果br 换行&#xff0c;单标签hr 水平分割线&#xff0c;单标签h1 ~ h6 标题标签&#xff0c;有加粗效果&#xff0c;h1最明显&#xff0c;往后依次减弱&#xff0c;独占一行&am…...

【PB案例学习笔记】-03用户名密码校验

写在前面 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git 需要源代码的小伙伴们可以自行…...

设计模式六大原则之 接口分离原则

文章目录 概念比较代码示例优势 小结 概念 要为各个类建立它们需要的专用接口&#xff0c;而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。 比较 概念有了&#xff0c;再来看看比较下吧&#xff0c;和单一职责比较比较。 接口隔离原则和单一职责都是为了提高类的…...

嵌入式学习——Shell()——day21

&#xff08;1&#xff09;标准IO——有缓存 1.打开文件 fopen 2.读写文件 fgetc/fputc fgets/fputs fprintf/fscanf 3.关闭文件 fclose 1. 缓存&#xff08;标准I…...

STM32学习计划

前言&#xff1a; 这里先记录下STM32的学习计划。 2024/05/08 今天我正在学习的是正点原子的I.MX6ULL APLHA/Mini 开发板的 Linux 之ARM裸机第二期开发的视频教程&#xff0c;会用正点原子的I.MX6ULL开发板学习第二期ARM裸机开发的教程&#xff0c;然后是学习完正点原子的I.M…...

小米15曝光?可能会要稍微涨价

也许是感受到了智能机市场的逐渐复苏&#xff0c;最近各大手机品牌发售新品的速度明显加快了。从4月份的Redmi、一加&#xff0c;再到5月份一大堆vivo、OPPO新机型的发布。而近日&#xff0c;有关小米14即将发售的消息也是悄咪咪的放了出来。 去年发售的小米14可以说是狠狠地让…...

深度优先搜索汇总

常用英文 最近公共祖先&#xff08;Lowest Common Ancestor&#xff0c;简称LCA&#xff09; posterity&#xff0c;英语单词&#xff0c;主要用作名词&#xff0c;作名词时译为“子孙&#xff0c;后裔&#xff1b;后代”。 什么是深度优先搜索 深度优先搜索&#xff0c;D…...

【虚拟仿真】Unity3D中实现对大疆无人机遥控器手柄按键响应

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 最近项目中需要用到大疆无人机遥控器对程序中无人机进行控制,遥控器是下图这一款: 博主发…...

Python学习之路 | Python基础语法(一)

数据类型 Python3 中常见的数据类型有&#xff1a; Number&#xff08;数字&#xff09;String&#xff08;字符串&#xff09;bool&#xff08;布尔类型&#xff09;List&#xff08;列表&#xff09;Tuple&#xff08;元组&#xff09;Set&#xff08;集合&#xff09;Dict…...

【已解决】AttributeError: module ‘clip‘ has no attribute ‘load‘

问题描述&#xff1a;运行YOLO-world时出现AttributeError: module clip has no attribute load。 情况分析&#xff1a; 1. 未安装clip包。 2. clip包中没有load方法。 解决办法&#xff1a; 1.重新安装clip包。 pip install clip pip install openai-clip 2. 安装后仍然报…...

安卓实现连接wesokcet

在build.gradle里引入依赖&#xff1a; implementation org.java-websocket:Java-WebSocket:1.5.2 在Androidmanifest.xml 文件里加入网络权限&#xff1a; <uses-permission android:name"android.permission.INTERNET" /> 代码&#xff1a; package com.x…...

Xinstall助力App下载量精准统计,洞悉推广效果

在移动互联网时代&#xff0c;App的下载量是衡量一个应用受欢迎程度的重要指标。然而&#xff0c;要精准统计App的下载量并不是一件容易的事情。为了解决这一难题&#xff0c;越来越多的开发者选择了Xinstall这一专业的App全渠道统计服务商。 Xinstall作为国内领先的App统计平…...

CSS字体修饰

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

高并发缓存服务的构建要点与陷阱

1. 缓存基础与特征 在讨论高并发环境下构建缓存服务的问题前&#xff0c;我们需要先了解缓存的基础和特征。缓存&#xff08;Cache&#xff09;是一种高速数据存储层&#xff0c;它可以存储临时数据&#xff0c;以便将来的请求能更快地获取到这些数据。从本质上讲&#xff0c;…...

Electron学习笔记(五)

文章目录 相关笔记笔记说明 七、系统1、系统对话框2、自定义窗口菜单3、系统右键菜单4、快捷键(1)、监听网页按键事件 &#xff08;窗口需处于激活状态&#xff09;(2)、监听全局按键事件 &#xff08;窗口无需处于激活状态&#xff09;(3)、补充&#xff1a;自定义窗口菜单快捷…...

【jest 调试 - vscode debug】

jest 测试typescript&#xff0c;如果想对测试文件本身断点调试。 安装jest相关依赖 # jest本体 npm install --save-dev jest # jest的类型声明 npm install --save-dev types/jest # typescript中使用 npm install --save-dev ts-jestlaunch.json 配置参考 {"type&qu…...

华为OD机试【分奖金】(java)(100分)

1、题目描述 公司老板做了一笔大生意&#xff0c;想要给每位员工分配一些奖金&#xff0c;想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序&#xff0c;每个人随机抽取一个数字。按照工号的顺序往后排列&#xff0c;遇到第一个数字比自己数字大的&#xff0c;那么&…...

27- ESP32-S3 USB虚拟串口(USB-OTG 外设介绍)

ESP32-S3 USB虚拟串口详解 USB-OTG 外设介绍 USB-OTG&#xff1a; USB-OTG是一种USB规范&#xff0c;允许嵌入式系统&#xff08;如手机、平板电脑、单片机系统等&#xff09;在没有主机&#xff08;如个人电脑&#xff09;的情况下直接相互通信&#xff0c;同时也能够作为传…...

PostgreSQL查看sql的执行计划

PostgreSQL查看sql的执行计划 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777在PostgreSQL中&#xff0c;查看…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...