EX_25/2/11
将 epoll 服务器
客户端拿来用 客户端:
写一个界面,里面有注册登录
服务器:处理注册和登录逻辑,注册的话将注册的账号密码写入数据库,登录的话查询数据库中是否存在账号,并验证密码是否正确
额外功能:客户端登录的时候,服务器向客户端发送一个验证码,只有验证码也正确的时候,才能登录成功·
服务器部分:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
#include <sys/epoll.h>
#include <sqlite3.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;enum Type
{TYPE_REGIST,TYPE_LOGIN,
// TYPE_CHAT
};typedef struct User
{char name[20];char pswd[20];
// int sock;}user_t;typedef struct Pack
{enum Type type;char name[20];char pswd[20];char tarname[20];char text[1024];
}pack_t;
void read_data(int client);
int insert_user(user_t user);
int find_user(const char *username);
int callback(void * arg,int argc,char** argv,char** col);
//user_t user_arr[50]={0};
//int user_len=0;
user_t user={0,0};
int main(int argc, const char *argv[])
{if(argc !=2){printf("请输入端口号:\n");return 1;}int port=atoi(argv[1]);int server=socket(AF_INET,SOCK_STREAM,0);addr_in_t addr={0};addr.sin_family=AF_INET;addr.sin_port=htons(port);addr.sin_addr.s_addr=inet_addr("0.0.0.0");if(bind(server,(addr_t*)&addr,sizeof(addr))==-1){perror("bind");return 1;}listen(server,10);int epfd=epoll_create1(EPOLL_CLOEXEC);struct epoll_event epoll_stdin={.events=EPOLLIN,.data.fd=0};struct epoll_event epoll_server={.events=EPOLLIN,.data.fd=server};epoll_ctl(epfd,EPOLL_CTL_ADD,0,&epoll_stdin);epoll_ctl(epfd,EPOLL_CTL_ADD,server,&epoll_server);struct epoll_event arr[50]={0};while(1){int len=epoll_wait(epfd,arr,50,-1);for(int i=0;i<len;i++){int fd=arr[i].data.fd;if(fd=server){printf("有客户端连接\n");int client=accept(server,0,0);struct epoll_event epoll_client={.events=EPOLLIN,.data.fd=client};epoll_ctl(epfd,EPOLL_CTL_ADD,client,&epoll_client);}else if(fd==0){char buf[64]="";scanf("%63s",buf);while(getchar()!=10);printf("键盘键入数据:%s\n",buf);}else{read_data(fd);}}}return 0;
}int insert_user(user_t user)
{
// user_arr[user_len]=user;
// user_len++;sqlite3* db=NULL;if(sqlite3_open("./test.db",&db)!=SQLITE_OK){printf("数据库打开失败\n");return -1;}strcat(user.name,",");strcat(user.name,user.pswd);strcat(user.name,")");char *buf=user.name;char* sql="insert into user(username,pswd) values(";strcat(sql,buf);char* errmsg=NULL;if(sqlite3_exec(db,sql,0,0,&errmsg)!=SQLITE_OK){return -1;}sqlite3_close(db);return 1;
}int find_user(const char* username)
{
/*for(int i=0;i<user_len;i++){if(strcmp(username,user_arr[i].name)==0){return i;}}return -1;
*/sqlite3* db=NULL;if(sqlite3_open("./test.db",&db)!=SQLITE_OK){printf("数据库打开失败\n");return -1;}char* sql="select * from user where username=";strcat(sql,username);char* errmsg=NULL;if(sqlite3_exec(db,sql,callback,&user,&errmsg)!=SQLITE_OK){sqlite3_close(db);return -1;}sqlite3_close(db);return 1;
}
int callback(void * arg,int argc,char** argv,char** col)
{user_t* brr=(user_t*)arg;strcpy(brr->name,argv[0]);strcpy(brr->pswd,argv[1]);return 1;
}void read_data(int client)
{pack_t pack={0};int res=read(client,&pack,sizeof(pack));switch(pack.type){case TYPE_REGIST:{int res=find_user(pack.name); char *msg=NULL;if(res==-1){user_t user ={0};strcpy(user.name,pack.name);strcpy(user.pswd,pack.pswd);insert_user(user);msg="注册成功";}else{msg="该账号已存在";}strcpy(pack.text,msg);write(client,&pack,sizeof(pack));break;}case TYPE_LOGIN:{int res=find_user(pack.name);char *msg=NULL;if(res=-1){msg="该账号不存在";}else{
// user_t user=user_arr[res];if(strcmp(user.pswd,pack.pswd)==0){msg="登录成功";
// user_arr[res].sock=client;}else{msg="密码错误";}}strcpy(pack.text,msg);write(client,&pack,sizeof(pack));break;}
/*case TYPE_CHAT:{char *msg=NULL;int res=find_user(pack.tarname);if(res==-1){msg="该用户不存在";strcpy(pack.text,msg);write(client,&pack,sizeof(pack));}else{user_t user=user_arr[res];if(user.sock==0){msg="用户未登录";strcpy(pack.text,msg);write(client,&pack,sizeof(pack));}else{int tarsock=user.sock;write(tarsock,&pack,sizeof(pack));}}break;}
*/}
}
客户端部分:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
#include <sys/epoll.h>
#include <sqlite3.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;enum Type
{TYPE_REGIST,TYPE_LOGIN,
// TYPE_CHAT
};typedef struct Pack
{enum Type type;char name[20];char pswd[20];char tarname[20];char text[1024];
}pack_t;void *thread_main(void *arg)
{int client=*(int*)arg;while(1){pack_t pack={0};int res=read(client,&pack,sizeof(pack));if(res==0){break;}switch(pack.type){case TYPE_REGIST:{printf("%s\n",pack.text);break;}case TYPE_LOGIN:{printf("%s\n",pack.text);break;}
// case TYPE_CHAT:
// {
// printf("接收到消息:%s\n",pack.text);
// break;
// }}}
}int main(int argc, const char *argv[])
{if(argc !=2){printf("请输入端口号:\n");return 1;}int port=atoi(argv[1]);int client=socket(AF_INET,SOCK_STREAM,0);addr_in_t addr={0};addr.sin_family=AF_INET;addr.sin_port=htons(port);addr.sin_addr.s_addr=inet_addr("192.168.133.128");if(connect(client,(addr_t*)&addr,sizeof(addr))==-1){perror("connect");return 1;}pthread_t id;pthread_create(&id,0,thread_main,&client);pthread_detach(id);while(1){int ch=-1;printf("1.注册\n");printf("2.登录\n");
// printf("3.聊天\n");printf("0.退出\n");printf("请选择:");scanf("%d",&ch);while(getchar()!=10);switch(ch){case 1:{pack_t pack={0};printf("请输入账号:");scanf("%s",pack.name);while(getchar()!=10);printf("请输入密码:");scanf("%s",pack.pswd);while(getchar()!=10);pack.type=TYPE_REGIST;write(client,&pack,sizeof(pack));break;}case 2:{pack_t pack={0};printf("请输入账号:");scanf("%s",pack.name);while(getchar()!=10);printf("请输入密码:");scanf("%s",pack.pswd);while(getchar()!=10);pack.type=TYPE_LOGIN;write(client,&pack,sizeof(pack));break;}
/* case 3:{pack_t pack={0};pack.type=TYPE_CHAT;scanf("%s %s",pack.tarname,pack.text);printf("tarname = %s\n",pack.tarname);while(getchar()!=10);write(client,&pack,sizeof(pack));break;}
*/case 0:{break;}}}return 0;
}
相关文章:
EX_25/2/11
将 epoll 服务器 客户端拿来用 客户端: 写一个界面,里面有注册登录 服务器:处理注册和登录逻辑,注册的话将注册的账号密码写入数据库,登录的话查询数据库中是否存在账号,并验证密码是否正确 额外功能&a…...
二.2 整数表示(2.1-2.4)
在本节中,我们描述用位来编码整数的两种不同的方式:一种只能表示非负数,而另一种能够表示负数、零和正数。后面我们将会看到它们在数学属性和机器级实现方面密切相关。我们还会研究扩展或者收缩一个已编码整数以适应不同长度表示的效果。 图2…...
中间件-安装Minio-集成使用(ubantu-docker)
目录 1、安装docer 2、运行以下命令拉取MinIO的Docker镜像 3、检查当前所有Docker下载的镜像 4、创建目录 5、创建Minio容器并运行 6、SDK操作 FileUploader.java 1、安装docer 参考这篇:Linux安装Docker 2、运行以下命令拉取MinIO的Docker镜像 docker pull…...
夸克网盘多链接批量保存,自动同步更新,批量分享
最近夸克网盘有点火,好多资源都上夸克网盘了,做了一个夸克网盘的批量化程序,已经打包好了,不用配置代码环境就能用 夸克网盘工具:https://pan.quark.cn/s/c22f3451a6ab 百度网盘工具:https://pan.quark.cn…...
2025清华:DeepSeek从入门到精通.pdf(附下载)
本文是一份关于如何深入理解和使用DeepSeek技术的全面指南,由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的余梦珑博士后及其团队编撰。DeepSeek是一家中国科技公司,专注于通用人工智能(AGI)的研发,其开源推…...
【AIGC】在VSCode中集成 DeepSeek(OPEN AI同理)
在 Visual Studio Code (VSCode) 中集成 AI 编程能力,可以通过安装和配置特定插件来实现。以下是如何通过 Continue 和 Cline 插件集成 DeepSeek: 一、集成 DeepSeek 获取 DeepSeek API 密钥:访问 DeepSeek 官方网站,注册并获取 …...
android动态设置是否允许应用卸载
摘要:通过广播设置全局参数控制应用是否允许卸载,全局参数在Launcher和PackageInstaller两个模块中使用到。此功能可用于MDM后台控制是否允许设备卸载应用。 1. 静态注册广播 由于系统安装和卸载的功能集中在PackageInstaller模块中,为了更…...
基于微信小程序的博物馆预约系统的设计与实现
hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...
使用NPOI自定义导出excel文件
说明 1、自定义列名,将从数据库查询到的数据赋值到对应的单元格上。 2、excel文件默认导出到桌面。 3、支持进度条显示。 界面 功能实现 public void TaskTest(){Task task new Task(ExportExcel);task.Start(); }/// <summary>/// 查询数据/// </summa…...
基于vue2 的 vueDraggable 示例,包括组件区、组件放置区、组件参数设置区 在同一个文件中实现
为了在Vue 2中实现一个包含组件区、组件放置区以及组件参数设置区的界面,我们可以使用vue-draggable库来处理拖拽功能,并结合其他UI组件库如Element UI来构建界面。下面是一个基本的示例,展示如何实现这样的布局。 第一步:安装必…...
使用rknn进行facenet部署
文章目录 开源仓库pth转onnxnetron可视化onnx转rknnC++实现开源仓库 https://github.com/bubbliiiing/facenet-pytorch pth转onnx 修改facenet网络的forward函数代码 修改前 def forward(self, x, mode = "predict"):if mode ==...
#渗透测试#批量漏洞挖掘#29网课交单平台 SQL注入
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 1. 漏洞原理 2. 漏洞定位 3. 攻击验证示…...
百问网imx6ullpro调试记录(linux+qt)
调试记录 文章目录 调试记录进展1.开发板相关1.1百问网乌班图密码 1.2 换设备开发环境搭建串口调试网络互通nfs文件系统挂载 1.3网络问题1.4系统启动1.5进程操作 2.QT2.1tslib1.获取源码2.安装依赖文件3.编译 2.2qt移植1.获取qt源码2.配置编译器3.编译 2.3拷贝到开发板1.拷贝2.…...
【python】3_容器
目录 一、列表 list 1.1基本语法 1.2 常用操作方法 1.3 列表的遍历 二、元组 tuple 特点: 三、字符串 常用操作方法: 四、序列 操作方法:切片 五、元素 特点: 基本语法: 集合常用功能: 六、字…...
数据结构与算法:动态规划dp:背包问题:理论基础(状态压缩/滚动数组)和相关力扣题(416. 分割等和子集、1049.最后一块石头的重量Ⅱ、494.目标和)
背包问题 01背包理论基础 对于01背包问题,物品下标为0到i,对应的重量为weight[0]到weight[i],价值为value[0]到value[i],每个物品只可以取或不取,背包最大容量为j的场景。 常见的状态转移方程如下: dp[i…...
数字游牧时代:IT人力外包的范式革命与文明重构
当英国工业革命时期的企业主们将生产环节外包给家庭作坊时,他们不会想到这种生产组织方式会演变为21世纪最复杂的商业形态。IT人力外包行业在经历三十年爆炸式增长后,正在经历一场静默的范式革命。这场革命不仅重构着全球IT产业链的拓扑结构,…...
Qt - 地图相关 —— 3、Qt调用高德在线地图功能示例(附源码)
效果 作者其他相关文章链接: Qt - 地图相关 —— 1、加载百度在线地图(附源码) Qt - 地图相关 —— 2、Qt调用百度在线地图功能示例全集,包含线路规划、地铁线路查询等(附源码) Qt - 地图相关 —— 3、Qt调用…...
cloudberry测试
一、引言 在当今大数据和 AI 飞速发展的时代,数据如同企业的核心资产,其价值不言而喻。数据库作为数据存储、管理和处理的关键工具,更是成为了各个领域的技术基石。无论是金融行业的交易记录处理,还是医疗领域的患者信息管理&…...
RocketMQ、RabbitMQ、Kafka 的底层实现、功能异同、应用场景及技术选型分析
1️⃣ 引言 在现代分布式系统架构中,📩消息队列(MQ)是不可或缺的组件。它在系统🔗解耦、📉流量削峰、⏳异步处理等方面发挥着重要作用。目前,主流的消息队列系统包括 🚀RocketMQ、&…...
UWB功耗大数据插桩调研
一、摘要 UWB功耗点 插桩点 日志关键字 电流 蓝牙持锁 BatteryStats的锁统计 vendor_bluetooth_lock 30~40mA 测距 UwbSessionManager.startRanging UwbSessionManager.stoptRanging 或接入fadiKey Uwb状态广播 "com.fadiui.dkservice.action.uwb.state.change&q…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
职坐标物联网全栈开发全流程解析
物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...
关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148515355 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
