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

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;
}

http://www.lryc.cn/news/534963.html

相关文章:

  • 二.2 整数表示(2.1-2.4)
  • 中间件-安装Minio-集成使用(ubantu-docker)
  • 夸克网盘多链接批量保存,自动同步更新,批量分享
  • 2025清华:DeepSeek从入门到精通.pdf(附下载)
  • 【AIGC】在VSCode中集成 DeepSeek(OPEN AI同理)
  • android动态设置是否允许应用卸载
  • 基于微信小程序的博物馆预约系统的设计与实现
  • 使用NPOI自定义导出excel文件
  • 基于vue2 的 vueDraggable 示例,包括组件区、组件放置区、组件参数设置区 在同一个文件中实现
  • 使用rknn进行facenet部署
  • #渗透测试#批量漏洞挖掘#29网课交单平台 SQL注入
  • 百问网imx6ullpro调试记录(linux+qt)
  • 【python】3_容器
  • 数据结构与算法:动态规划dp:背包问题:理论基础(状态压缩/滚动数组)和相关力扣题(416. 分割等和子集、1049.最后一块石头的重量Ⅱ、494.目标和)
  • 数字游牧时代:IT人力外包的范式革命与文明重构
  • Qt - 地图相关 —— 3、Qt调用高德在线地图功能示例(附源码)
  • cloudberry测试
  • RocketMQ、RabbitMQ、Kafka 的底层实现、功能异同、应用场景及技术选型分析
  • UWB功耗大数据插桩调研
  • 郭羽冲IOI2024参赛总结
  • 03:Spring之Web
  • lx-music落雪音乐-开源免费听歌软件[提供最新音源使用, 支持全网平台, 支持无损音乐下载]
  • 129,【2】buuctf [BJDCTF2020]EzPHP
  • Python 面向对象(类,对象,方法,属性,魔术方法)
  • C语言之扫雷
  • 半导体制造工艺讲解
  • Ollama+DeepSeek R1+AnythingLLM训练自己的AI智能助手
  • 基于java手机销售网站设计和实现(LW+源码+讲解)
  • 5-R循环
  • Qlabel 每五个一换行 并、号分割