【智能家居】四、网络服务器线程控制功能点
网络控制
网络线程控制功能点代码
- inputCommand.h(输入控制指令)
- socketControl.c(socket网络控制指令)
- main.c(主函数)
- 编译
- 运行结果
网络控制
Linux网络编程
“网络控制”(Network Control)通常指的是通过网络对远程设备、系统或服务进行管理和监控的过程。这可以包括远程设备的配置、监测、故障排除、升级等操作。网络控制的目的是在分布式环境中实现对各种网络设备和资源的远程管理。
网络控制的关键特性和功能包括:
-
远程管理: 允许管理员或系统操作员通过网络连接到远程设备或系统,执行各种管理任务,而无需物理接触设备。
-
配置管理: 能够通过网络修改和配置设备的各种参数,例如网络设置、安全配置、服务设置等。
-
监控和诊断: 实时监测远程设备的性能、状态和运行情况,以及执行远程故障诊断。
-
远程升级: 允许通过网络远程升级设备的固件、软件或操作系统,以确保设备始终具有最新的功能和安全性。
-
故障排除: 提供对设备进行故障排除的工具和功能,以便在出现问题时进行远程修复。
-
安全性: 网络控制需要具备安全机制,以确保远程访问和操作的安全性,包括身份验证、加密通信等。
-
自动化: 通过网络控制可以实现自动化操作,例如定期计划的任务、自动备份等。
-
远程命令执行: 允许通过网络发送命令到远程设备执行,这对于远程调试和控制非常有用。
网络控制在各种领域都有应用,包括物联网设备、网络设备、服务器管理、远程监控系统等。这种远程控制的能力在大规模、分布式、或难以物理接触的环境中尤为重要,可以提高效率、降低成本,并加强对整个网络基础设施的管理和控制。
以下是一个基于 POSIX 线程的简单网络控制的例子:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>// 模拟网络控制的数据结构
struct NetworkControl {int isConnected; // 模拟网络连接状态pthread_mutex_t mutex; // 用于同步的互斥锁
};// 初始化网络控制
void initNetworkControl(struct NetworkControl *network) {network->isConnected = 0;pthread_mutex_init(&network->mutex, NULL);
}// 模拟网络连接函数
void connectToNetwork(struct NetworkControl *network) {pthread_mutex_lock(&network->mutex);network->isConnected = 1;pthread_mutex_unlock(&network->mutex);printf("Connected to the network.\n");
}// 模拟网络断开函数
void disconnectFromNetwork(struct NetworkControl *network) {pthread_mutex_lock(&network->mutex);network->isConnected = 0;pthread_mutex_unlock(&network->mutex);printf("Disconnected from the network.\n");
}// 网络控制线程执行函数
void *networkControlThread(void *data) {struct NetworkControl *network = (struct NetworkControl *)data;while (1) {// 模拟网络连接和断开connectToNetwork(network);sleep(2);disconnectFromNetwork(network);sleep(2);}pthread_exit(NULL);
}int main() {// 初始化网络控制struct NetworkControl network;initNetworkControl(&network);pthread_t network_control_thread;// 创建网络控制线程if (pthread_create(&network_control_thread, NULL, networkControlThread, (void *)&network) != 0) {fprintf(stderr, "Failed to create network control thread.\n");return 1;}// 主函数等待网络控制线程退出pthread_join(network_control_thread, NULL);// 销毁互斥锁pthread_mutex_destroy(&network.mutex);return 0;
}
在这个例子中,我们使用了一个简单的数据结构 struct NetworkControl 来表示网络控制状态,使用互斥锁 pthread_mutex_t 来确保线程安全。网络控制线程不断地模拟连接和断开操作。主函数等待网络控制线程退出,然后销毁互斥锁。这只是一个简单的例子,实际中可能需要根据具体需求进行更复杂的网络控制实现。
网络线程控制功能点代码
inputCommand.h(输入控制指令)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <wiringPi.h>
#include <wiringSerial.h>struct InputCommand
{char commandName[128]; //“控制方式”名char deviceName[128]; //“设备工厂”名char command[32]; //存放指令int fd; //存放文件描述符(串口/网络)int s_fd; //存放服务器套接字描述符char port[12]; //存放端口号char ipAdress[32]; //存放 IP地址char log[1024]; //日志int (*Init)(struct InputCommand *voice); //“初始化”函数指针int (*getCommand)(struct InputCommand *voice); //“获取指令”函数指针struct InputCommand *next;
};struct InputCommand* addVoiceControlToInputCommandLink(struct InputCommand *phead); //“语音控制”加入指令链表函数声明struct InputCommand* addSocketControlToInputCommandLink(struct InputCommand *phead); //“网络控制”加入指令链表函数声明
socketControl.c(socket网络控制指令)
#include "inputCommand.h"// 套接字初始化函数
int socketInit(struct InputCommand *socketMsg)
{int s_fd; //套接字描述符struct sockaddr_in s_addr;memset(&s_addr, 0, sizeof(struct sockaddr_in)); //数据清空// 1. 创建套接字,ipv4,tcp协议s_fd=socket(AF_INET, SOCK_STREAM, 0);if (s_fd == -1) {perror("socket:");exit(-1);}s_addr.sin_family = AF_INET; //ipv4s_addr.sin_port = htons(atoi(socketMsg->port)); //端口号,选择5000以上。honts返回网络字节序,atoi(argv[2])防止端口被占用inet_aton(socketMsg->ipAdress, &s_addr.sin_addr); //转换为网络能识别的格式// 2. 绑定bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));// 3. 监听listen(s_fd, 10); //监听10个连接printf("socket Server listening ...\n");socketMsg->s_fd = s_fd; // 保存套接字描述符return s_fd;
}// 全局变量,表示 socket 控制的输入命令对象
struct InputCommand socketControl = {.commandName = "socket",.command = '\0',.port = "8080",.ipAdress = "192.168.1.254",.Init = socketInit,.log = {'\0'},.next = NULL
};// 将 socket 控制对象加入到输入命令链表中的函数
struct InputCommand* addSocketControlToInputCommandLink(struct InputCommand *phead)
{if (phead == NULL) {return &socketControl;}else {socketControl.next = phead;phead = &socketControl;return phead;}
}
main.c(主函数)
#include <pthread.h>
#include "controlDevice.h"
#include "inputCommand.h"struct InputCommand *pcommandHead = NULL; // 定义指令工厂初始链表头
struct InputCommand *socketHandler = NULL; // 全局变量,用于处理 socket 控制// 读取 TCP 端口指令的线程执行函数
void *socketReadThread(void *data)
{int n_read;printf("Connect success\n");while (1) {memset(socketHandler->command, '\0', sizeof(socketHandler->command));n_read = read(socketHandler->fd, socketHandler->command, sizeof(socketHandler->command));if (n_read == -1) {perror("read:");} else {printf("Get SocketCommand --> %s\n", socketHandler->command);}}
}// 网络控制线程执行函数
void *socketControlThread(void *data)
{int c_fd; // 客户端套接字描述符struct sockaddr_in c_addr;memset(&c_addr, 0, sizeof(struct sockaddr_in));int clen = sizeof(struct sockaddr_in);pthread_t socketRead_thread; // 线程里面套线程,网络连接后信息通信// 查找名为 "socket" 的指令处理对象socketHandler = findCommandByName("socket", pcommandHead);if (socketHandler == NULL) {printf("find socketHandler error\n");pthread_exit(NULL);}// 初始化网络控制功能if (socketHandler->Init(socketHandler) < 0) {printf("socketControl init error\n");pthread_exit(NULL);} else {printf("socketControl init success\n");}while (1) {// 4. 接收连接c_fd = accept(socketHandler->s_fd, (struct sockaddr *)&c_addr, &clen); // 接收连接请求,阻塞至有客户端完成三次握手socketHandler->fd = c_fd; // 将套接字描述符返回给 "网络控制" 链表节点pthread_create(&socketRead_thread, NULL, socketReadThread, NULL); // 创建新线程:用于读取 TCP 端口指令}
}int main()
{if (wiringPiSetup() == -1) {fprintf(stdout, "Unable to start wiringPi: %s\n", strerror(errno));return 1;}pthread_t socketControl_thread;// 指令工厂初始化,将 socket 控制对象加入到输入命令链表中pcommandHead = addSocketControlToInputCommandLink(pcommandHead);// 创建网络控制线程pthread_create(&socketControl_thread, NULL, socketControlThread, NULL);// 主函数等待网络控制线程退出pthread_join(socketControl_thread, NULL);return 0;
}
相关文章:
【智能家居】四、网络服务器线程控制功能点
网络控制 网络线程控制功能点代码 inputCommand.h(输入控制指令)socketControl.c(socket网络控制指令)main.c(主函数)编译运行结果 网络控制 Linux网络编程 “网络控制”(Network Control&a…...
localForage使用 IndexedDB / WebSQL存储
一、什么是 localForage 当我们的存储量比较大的时候,我们一定会想到我们的 indexedDB,让我们在浏览器中也可以 使用数据库这种形式来玩转本地化存储,然而 indexedDB 的使用是比较繁琐而复杂的, 有一定的学习成本,但 …...
Hdoop学习笔记(HDP)-Part.03 资源规划
目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …...
SQL -高阶3
zstarling 字符串拼接与类型转换最大,最小值,提取日期部分的数值日期截断 字符串拼接与类型转换 新语法SQL delete from public.basiclaw_qr_staff_ac ct where batch_date || data_dt || :: date and biz_line || biz_line || ;详解 该 SQL 语句…...
HarmonyOS4.0系列——03、声明式UI、链式编程、事件方法、以及自定义组件简单案例
HarmonyOS4.0系列——03、声明式UI、链式编程、事件方法、以及自定义组件简单案例 声明式 UI ArkTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑。 如果组件的接口定义没有包…...
播放器开发(六):音频帧处理并用SDL播放
目录 学习课题:逐步构建开发播放器【QT5 FFmpeg6 SDL2】 步骤 AudioOutPut模块 1、初始化【分配缓存、读取信息】 2、开始线程工作【从队列读帧->重采样->SDL回调->写入音频播放数据->SDL进行播放】 主要代码 分配缓存 // 对于样本队列 av_audio_…...
Qt 问题记录
问题记录 运行时出现的问题 运行出现的warning QWidget::repaint: Recursive repaint detected在paintEvent中使用painter绘制了线段、图片,移动了QWidget,加入了下面代码导致的 QApplication::processEvents();屏蔽后没有出现该warning QApplicati…...
Go 语言真正有什么用处?
在其十几年的发展过程中,Google 的Go 编程语言已经从 alpha 极客的好奇心发展成为世界上一些最重要的云原生软件项目背后经过考验的编程语言。 为什么Docker、Kubernetes等项目的开发者会选择 Go ?Go 的定义特征是什么?它与其他编程语言有何…...
贪心 55. 跳跃游戏 45.跳跃游戏 II
55. 跳跃游戏 题目: 给定非负数组,初始位置在数组第一格,数组值是可以选择的最大跳跃步数,判断能不能达到数组末尾。 示例 1: * 输入: [2,3,1,1,4] * 输出: true * 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1,…...
为XiunoBBS4.0开启redis缓存且支持密码验证
修改模块文件1 xiunoPHP/cache_redis.class.php: <?phpclass cache_redis {public $conf array();public $link NULL;public $cachepre ;public $errno 0;public $errstr ;public function __construct($conf array()) {if(!extension_loaded(Redis)) {return $thi…...
手把手教你写一个Shell脚本部署你的服务
我们都知道,在开发的过程中,有很多部署自己微服务的方式,其中有各种各样的不同操作,比如使用 docker 打包为镜像的方式,还有基础使用 jar 包的方式进行部署,但是呢?使用 jar 包部署,…...
银行数字化产品方案
在互联网及金融科技公司快速发展的时代背景下,银行客户普遍都意识到了自己在客户体验、客户洞察、产品服务方面受到的来自互联网的挑战 。为了更好地面对各方面的挑战,传统的业务模式必须革新。传统银行都在积极进行数字化转型。同时,也要面对…...
C# datagridview控件 绑定数据库中表中数据的方式-3
1.如下图所示,为数据库中的一张表结构,注意该表中共有11个字段 2.首先在窗体后台代码中拖入一个datagridview控件,并在窗体加载时,给datagridview控件添加列,添加的方式如下所示:请注意,每个列…...
Amazon CodeWhisperer 正式发布可免费供个人使用
文章作者:sunny 亚马逊云科技日前推出了实时 AI 编程助手 Amazon CodeWhisperer,包括个人套餐和专业套餐,所有开发人员均可免费使用个人套餐。Amazon CodeWhisperer 让开发人员能够保持专注、高效,帮助他们快速、安全地编写代码&a…...
el-table根据返回数据回显选择复选框
接口给你返回一个集合,然后如果这个集合里面的status2,就把这一行的复选框给选中 注意: 绑定的ref :row-key"getRowKeys" this.$refs.multiTableInst.toggleRowSelection(this.list[i], true); <el-table :data"list"…...
代码随想录算法训练营第四十二天 _ 动态规划_01背包问题。
学习目标: 动态规划五部曲: ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录! 60天训练营打卡计划! 学习内容: 二维数组处理01背包问题 听起来…...
会话 cookie 及隐私的那些事
什么是会话 Cookie? 会话 Cookie 的概念非常简单。 会话 Cookie,也称为临时 Cookie 或内存 Cookie,是网站在浏览会话期间存储在用户计算机或设备上的小数据片段。 它是由网站生成并由您的浏览器存储和使用的多种 Cookie 之一。 常规 Cookie 或“持久”Cookie 是通常在您的…...
前端知识笔记(二十九)———MySQL通配符和正则表达式
一、通配符 1.% 匹配0,1,多个字符,但不匹配NULL 2._ 匹配单个字符 3.[charlist] 匹配字符列中的任何单一字符 4.[^charlist] 或 [!charlist] 匹配不在字符列中的任何单一字符 二、正则表达式 通配符的LIKE替换为REGEXP LIKE 匹配整个列&…...
C#网络编程(System.Net.Sockets命名空间)
目录 一、Socket类 1.示例源码 2.生成效果 二、TcpClient类和TcpListener类 1.示例源码 2.生成效果 三、UdpClient类 1.示例源码 2.生成效果 System.Net.Sockets命名空间主要提供制作Sockets网络应用程序的相关类,其中Socket类、TcpClient类、TcpListener类…...
linux 系统重装 ssh 连接失败
一.错误描述 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 二.解决方案 输入以下指令: ssh-keygen -R XXX(ip地址) 按照我的例子(ip:10.165.7.136),会返回以下信息: 重新尝试连…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
