【智能家居】四、网络服务器线程控制功能点

网络控制
网络线程控制功能点代码

  • inputCommand.h(输入控制指令)
  • socketControl.c(socket网络控制指令)
  • main.c(主函数)
  • 编译
  • 运行结果

网络控制

Linux网络编程

“网络控制”(Network Control)通常指的是通过网络对远程设备、系统或服务进行管理和监控的过程。这可以包括远程设备的配置、监测、故障排除、升级等操作。网络控制的目的是在分布式环境中实现对各种网络设备和资源的远程管理。

网络控制的关键特性和功能包括:

  1. 远程管理: 允许管理员或系统操作员通过网络连接到远程设备或系统,执行各种管理任务,而无需物理接触设备。

  2. 配置管理: 能够通过网络修改和配置设备的各种参数,例如网络设置、安全配置、服务设置等。

  3. 监控和诊断: 实时监测远程设备的性能、状态和运行情况,以及执行远程故障诊断。

  4. 远程升级: 允许通过网络远程升级设备的固件、软件或操作系统,以确保设备始终具有最新的功能和安全性。

  5. 故障排除: 提供对设备进行故障排除的工具和功能,以便在出现问题时进行远程修复。

  6. 安全性: 网络控制需要具备安全机制,以确保远程访问和操作的安全性,包括身份验证、加密通信等。

  7. 自动化: 通过网络控制可以实现自动化操作,例如定期计划的任务、自动备份等。

  8. 远程命令执行: 允许通过网络发送命令到远程设备执行,这对于远程调试和控制非常有用。

网络控制在各种领域都有应用,包括物联网设备、网络设备、服务器管理、远程监控系统等。这种远程控制的能力在大规模、分布式、或难以物理接触的环境中尤为重要,可以提高效率、降低成本,并加强对整个网络基础设施的管理和控制。

以下是一个基于 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;
}

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

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

相关文章

openEuler学习04-ssl升级到openssl-1.1.1w

当前环境ssl的版本是 1.1.1f &#xff0c;计划升级到openssl-1.1.1w [roottest ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-SP3)&q…

ES6 Promise的用法,async/await异步处理同步化

文章目录 一、什么是promise &#xff1f;二、await / async ES7的新规范&#xff0c;异步处理同步化 一、什么是promise &#xff1f; promise是解决异步的方法&#xff0c;本质上是一个构造函数&#xff0c;可以用它实例化一个对象。对象身上有resolve、reject、all&#xff…

java学习part33Date

1.Jdk8之前 1.1当前系统时间 1.2.Date类 1.2.1util.date 两个构造器两个方法 1.2.2sql.date 1.3SimpleDateFormat日期格式 1.4Calendar日历 147-常用类与基础API-JDK8之前日期时间API的使用&#xff1a;Date、SimpleDateFormat、Calendar_哔哩哔哩_bilibili 2.Jdk8 2.1本地时…

【C语言学习疑难杂症】第6期:C语言中如何打印一些特殊字符,比如打印扩展ascii码字符

首先我们来看下ascii表和ascii拓展表: ascii表中的字符只有128个,是从0-127,而拓展ascii表的内容是128-255。拓展表中它们都是一些特殊的字符,如果我们想答应ascii拓展码中的一些字符应该要怎么操作呢? 比如下面的代码: unsigned char a = 176, b = 219;printf("%…

Nginx反向代理和负载均衡详细教程

1、Nginx反向代理概述 关于正向代理和反向代理&#xff0c;我们在前面的章节已经通过一张图给大家详细的介绍过了&#xff0c;简而言之就是正向代理代理的对象是客户端&#xff0c;反向代理代理的是服务端&#xff0c;这是两者之间最大的区别。 Nginx即可以实现正向代理&#x…

游戏被流量攻击会有什么样的影响,该用什么样的防护方式去处理

德迅云安全-领先云安全服务与解决方案提供商德迅云游戏盾专门针对游戏进行防护&#xff0c;可免费提供防护方案~ 如果游戏被流量攻击会产生以下影响&#xff1a; 服务器过载&#xff1a;流量攻击会导致游戏服务器接收到的请求数量急剧增加&#xff0c;超出服务器的处理能力。这…

ESP32-Web-Server编程综合项目1-结合 Web Server 实现 WiFi 配网和网页 OTA 更新

ESP32-Web-Server编程综合项目1-结合 Web Server 实现 WiFi 配网和网页 OTA 更新 概述 前述的内容多是一个个小功能的演示&#xff0c;本章节讲述一些实际项目中使用到的综合项目。 首先要讲述的案例是通过ESP32 上的 Web Server 实现对 ESP32 的 WiFi 配网和网页 OTA 更新功…

探究两个互联网时代的差异,Web 2.0 与 Web 3.0 区别

Web 2.0 的特征 首先我们来了解一下 Web 2.0 的特征都有哪些。 用户生成内容&#xff1a;Web 2.0 时代以用户生成内容为特征&#xff0c;用户可以轻松地在网络上分享、创建和编辑信息。社交媒体平台、博客等网站的兴起使得用户成为信息的创造者&#xff0c;网络逐渐从被动浏览…

tp6框架 万级数据入库 php函数优化

将万级数据入库并判断有无 没有则新增 上篇是用mysql的replace into实现 本篇是另一种方法 这是我的数据格式&#xff1a; $data [ [ KCH > value1, other_column1 > value_other1_1, other_column2 > value_other2_1, ], [ KCH > value2, other_column…

时间序列趋势检验相关检验方法:斜率法、Cox-Stuart检验、Mann-Kendall检验

文章目录 1.斜率法1.1.原理1.2.优缺点1.3.Python代码2.Cox-Stuart检验2.1.原理2.2.优缺点2.3.Python代码3.Mann-Kendall 检验3.1.原理3.1.1.假设前提3.1.2.趋势检验3.1.3.S到Z的变换原理3.1.4.Var(s)是如何得到的3.1.5.衡量趋势的指标:倾斜度

增强现实技术革新零售业:提升购物体验的未来技术

增强现实&#xff08;AR&#xff09;技术正在改变零售业的面貌&#xff0c;为消费者提供了全新的购物体验。本文将探讨AR技术在零售行业中的应用&#xff0c;以及它如何改变传统的购物方式。 首先&#xff0c;AR技术允许消费者在现实世界中查看虚拟的产品展示。在服装和家具行业…

linux具体命令(持续更新中)

1. cd CD命令是Linux和类Unix操作系统中非常常用的一个命令&#xff0c;它的全称是“change directory”&#xff0c;用于改变当前的工作目录。用户可以通过这个命令进入到不同的目录中&#xff0c;进行文件操作或是执行其他任务。 以下是CD命令的一些基本用法&#xff1a; 进…

使用Redis构建任务队列

文章目录 第1关&#xff1a;先进先出任务队列第2关&#xff1a;优先级任务队列第3关&#xff1a;定时任务队列 第1关&#xff1a;先进先出任务队列 编程要求 在Begin-End区域编写 add_task(task_name) 函数&#xff0c;实现将任务加入队列的功能&#xff0c;具体参数与要求如下…

tomcat控制台中文信息显示乱码

问题现象 我的tomcat版本是10.1版本。 在cmd下启动tomcat&#xff0c;会新打开控制台输出窗口&#xff1a; 控制台窗口输出的中文信息是乱码&#xff1a; 问题原因 产生这个问题的原因是&#xff1a;控制台窗口的编码和输出到控制台窗口的日志信息编码不一致。 查看tomc…

Kubernetes学习笔记-Part.01 Kubernets与docker

目录 Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退 第一章 Kubernets与docker Docker是一种轻量级的容器…

Linux 基础命令

1 Linux 基础 1.1 用户类型 1.2 终端 Terminal 设备终端&#xff1a;键盘&#xff0c;鼠标&#xff0c;显示器 1.2.1 终端类型 1.2.2 查看当前的终端设备 tty 命令可以查看当前所在的终端 范例&#xff1a; # tty 可以查看当前所在的终端 $ tty /dev/pts/1 $ who am i ro…

ChatGPT有什么新奇的使用方式?

2023&#xff0c;ChatGPT几乎席卷了所有行业&#xff0c;并且具有不可测量的巨大潜力等着我们去挖掘。 越来越多人对ChatGPT的应用产生兴趣&#xff0c;知乎上“ChatGPT有什么新奇的使用方式&#xff1f;”这一个热门话题的兴起就是最好的证明。 写作&#xff0c;毫无疑问&…

SmartSoftHelp8,数据库字段详细文档自动生成工具

数据库开发文档自动生成 包括数据库设计详细信息&#xff1a; 数据库字段名称&#xff0c;数据类型&#xff0c;大小&#xff0c;是否主键&#xff0c;说明等 一键自动生成开发需求文档 导出html 格式方便查询 下载地址 https://pan.baidu.com/s/1zBgeYsqWnSlNgiKPR2lUYg…

目标检测算法改进系列之添加变核卷积AKConv模块

AKConv变核卷积 KConv的主要思想&#xff1a;AKConv&#xff08;可变核卷积&#xff09;主要提供一种灵活的卷积机制&#xff0c;允许卷积核具有任意数量的参数和采样形状。这种方法突破了传统卷积局限于固定局部窗口和固定采样形状的限制&#xff0c;从而使得卷积操作能够更加…

oops-framework框架 之 本地存储(五)

引擎&#xff1a; CocosCreator 3.8.0 环境&#xff1a; Mac Gitee: oops-game-kit 注&#xff1a; 作者dgflash的oops-framework框架QQ群&#xff1a; 628575875 简介 在CocosCreator中&#xff0c;本地存储主要使用sys.localStorage 接口&#xff0c;通过 key-value的格式进…