网络编程-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;
}