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

网络编程-day5-sqlite3数据库

思维导图

 服务器

#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)
{

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

客户端

#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;
			}
		}
	}
}
 
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("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 0:
			{
				break;
			}
		}
	}
	return 0;
}
 

http://www.kler.cn/a/542525.html

相关文章:

  • Docker Compose介绍及安装使用MongoDB数据库详解
  • 计算机毕业设计——Springboot的旅游管理
  • Leetcode 3448. Count Substrings Divisible By Last Digit
  • 8.大规模推荐系统的实现
  • Leetcode - 149双周赛
  • 高通android WIFI debug
  • DeepSeek 大模型在 Mac 上的部署和运行
  • python基础入门:8.1项目1:爬虫与数据分析
  • 无人机避障——基于ESDF地图的JPS算法前端路径规划
  • 每日一题——有重复项数字的全排列
  • Kafka 中基于 Segment 和 Offset 查找消息的过程
  • 解决 keep-alive 缓存组件中定时器干扰问题
  • STM32、GD32驱动TM1640原理图、源码分享
  • 新数据结构(4)——Java继承
  • Python实现GO鹅优化算法优化支持向量机SVM分类模型项目实战
  • 港中文腾讯提出可穿戴3D资产生成方法BAG,可自动生成服装和配饰等3D资产如,并适应特定的人体模型。
  • Java 读取 PDF 模板文档并替换内容重新生成 PDF
  • CES Asia 2025:科技盛宴助力中国数字经济腾飞
  • 中间件-安装Minio-集成使用(ubantu-docker)
  • Vue项目--动画效果的改变
  • Swift的方法派发机制
  • 模块化的基本概念
  • docker 安装 Prometheus、Node Exporter 和 Grafana
  • 【如何掌握CSP-J 信奥赛中的排序算法】
  • oracle执行grant授权sql被阻塞问题处理
  • 【PromptCoder + Bolt.new】自动生成页面和路由——提升开发效率的利器