网络编程-day5-sqlite3数据库

思维导图

服务器

cs 复制代码
#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;
			}
	}
}

客户端

cs 复制代码
#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;
}
 
相关推荐
信阳农夫27 分钟前
python 3.6.8支持的Django版本是多少?
python·django·sqlite
真正的醒悟28 分钟前
H3C交换机&路由器&防火墙FTP/TFTP服务器搭建。
服务器·网络·智能路由器
圆内~搁浅33 分钟前
langchain本地知识库问答机器人集成本地知识库
数据库·langchain·机器人
春生黎至10051 小时前
路由基本配置
网络·智能路由器
早起的年轻人1 小时前
Docket Desktop 安装redis 并设置密码
数据库·redis·缓存
xlxxy_2 小时前
ABAP数据库表的增改查
开发语言·前端·数据库·sql·oracle·excel
Hacker_LaoYi2 小时前
x安全服务 y安全体系 z网络安全模型 网络安全体系设计
网络·安全·web安全
清水加冰2 小时前
【MySQL】索引
数据库·mysql
qw9492 小时前
Redis(高阶篇)03章——缓存双写一致性之更新策略探讨
数据库·redis·缓存