服务器
fun.c
#ifndef __FUNS_H__
#define __FUNS_H__
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <dirent.h>
#include <errno.h>
#include <strings.h>
#include <sqlite3.h>
#include <sys/epoll.h>
#include <time.h>
#define PORT 8881
#define IP "192.168.250.100"
typedef struct staff_info{
int id; // 员工编号
int usertype; // ADMIN 0 USER 1
char name[20]; // 姓名
char passwd[20]; // 密码
int age; // 年龄
char phone[20]; // 电话
char addr[64]; // 地址
char work[20]; // 职位
char date[20]; // 入职年月
int level; // 等级
double salary ; // 工资
}staff_info_t;
typedef struct {
int msgtype; //请求的消息类型
int usertype; //ADMIN 1 USER 2
char username[20]; //姓名
char passwd[20]; //登陆密码
char recvmsg[64]; //通信的消息
int flags; //标志位
staff_info_t info; //员工信息
}MSG;
//回收僵尸进程
int sighandler(void);
//设置网络属性
int set_network(int sfd);
//创建用户信息表
int set_user_form(sqlite3* db);
//创建历史记录表
int set_history_form(sqlite3* db);
//管理用户模式
int do_administrator(sqlite3* db,int newfd);
//普通用户模式
int do_ordinary(sqlite3* db,int newfd);
//添加
int add_user(sqlite3* db,int newfd);
//按人名查询
int query_info(sqlite3* db,int newfd);
//查询所有
int query_all(sqlite3* db,int newfd);
//修改
int revise_info(sqlite3* db,int newfd);
//修改个人信息
int revise_myself(sqlite3* db,int newfd);
//删除
int Record_user(sqlite3* db,int newfd);
//查询历史记录
int history_Record(sqlite3* db,int newfd);
#endif
main.c
#include "fun.h"
MSG msg;
MSG his;
int main(int argc,const char * argv[])
{
//回收僵尸进程
sighandler();
//创建流试套接字
int sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
perror("socket");
return -1;
}
//设置网络属性
set_network(sfd);
//创建并打开数据库
sqlite3 *db = NULL;
if(sqlite3_open("./my.db",&db)!=SQLITE_OK)
{
printf("sqlite3_open:%d\n",sqlite3_errcode(db));
return -1;
}
//创建用户信息表
set_user_form(db);
//创建历史记录表
set_history_form(db);
int newfd = 0;
struct sockaddr_in sin;
socklen_t addrlen = sizeof(sin);
while(1)
{
//accept函数由父进程来执行
newfd = accept(sfd,(struct sockaddr*)&sin,&addrlen);
if(newfd<0)
{
perror("accept");
return -1;
}
printf("[%s:%d]客户端连接成功\n",inet_ntoa(sin.sin_addr),\
ntohs(sin.sin_port));
pid_t pid = fork();
if(pid>0)
{
close(newfd);
}
//子进程进行与客户端的交互
else if(pid==0)
{
close(sfd);
int res = 0;
while(1)
{
bzero(&msg,sizeof(msg));
res = recv(newfd,&msg,sizeof(msg),0);
if(res<0)
{
perror("recv");
return -1;
}
else if(res==0)
{
printf("[%s:%d]客户端断开\n",inet_ntoa(sin.sin_addr),\
ntohs(sin.sin_port));
close(newfd);
return -1;
}
//判断客户端要使用的功能
switch(msg.msgtype)
{
case 0:
//管理用户模式
bzero(&his,sizeof(his));
his = msg;
do_administrator(db,newfd);
break;
case 1:
//普通用户模式
do_ordinary(db,newfd);
break;
case 2:
//按人名查询
query_info(db,newfd);
break;
case 3:
//修改
revise_info(db,newfd);
break;
case 4:
//添加
add_user(db,newfd);
break;
case 5:
//删除
Record_user(db,newfd);
break;
case 6:
//查询历史记录
history_Record(db,newfd);
break;
case 7:
//退出登录
break;
case 8:
//查询所有
query_all(db,newfd);
break;
case 9:
//修改个人信息
revise_myself(db,newfd);
break;
}
}
}
}
close(sfd);
return 0;
}
fun.c
#include "fun.h"
extern MSG msg;
extern MSG his;
//回收僵尸进程
typedef void(*sighandler_t)(int);
void handler(int sig)
{
while(waitpid(-1,NULL,WNOHANG)>0);
}
int sighandler()
{
sighandler_t s = signal(17,handler);
if(s==SIG_ERR)
{
perror("signal");
return -1;
}
return 0;
}
//设置网络属性
int set_network(int sfd)
{
//允许端口快速被重用
int reuse = 1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
{
perror("setsockopt");
return -1;
}
//获取服务器地址信息的结构体
struct sockaddr_in sin;
socklen_t addrlen = sizeof(sin);
sin.sin_family = AF_INET; //必须填AF_INET
sin.sin_port = htons(PORT); //端口号的网络字节序;(1024~49151)
sin.sin_addr.s_addr = inet_addr(IP); //本机IP地址
//绑定服务器端口号与ip
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0)
{
perror("bind");
return -1;
}
//将套接字设置为被动监听状态
if(listen(sfd,128)<0)
{
perror("listen");
return -1;
}
printf("服务器开启监听\n");
return 0;
}
//创建用户信息表
int set_user_form(sqlite3* db)
{
staff_info_t info;
char* errmsg = NULL;
char sql[256] = "create table if not exists user(id int PRIMARY KEY,type int,name char, password char,age int,phone char,addr char,work char,data char,level int,salary double);";
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
//存入一个管理员用户
info.id = 1001;
info.usertype = 0;
strcpy(info.name,"Bill");
//info.name[20] = "Bill";
strcpy(info.passwd,"716815");
info.age = 23;
strcpy(info.phone,"187149398xx");
strcpy(info.addr,"myhome");
strcpy(info.work,"writer");
strcpy(info.date,"2023.2.27");
info.level = 10;
info.salary = 30000;
bzero(sql,sizeof(sql));
sprintf(sql,"insert into user values (1001,0,\"%s\",\"%s\",23,\"%s\",\"%s\",\"%s\",\"%s\",10,30000);",info.name,info.passwd,info.phone,info.addr,info.work,info.date);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
return -1;
}
return 0;
}
//创建历史记录表
int set_history_form(sqlite3* db)
{
char* errmsg = NULL;
char sql[256] = "create table if not exists history_Record(data char,name char,events char);";
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
bzero(sql,sizeof(sql));
strcpy(sql,"delete from history_Record;");
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
return 0;
}
//管理用户模式
int do_administrator(sqlite3* db,int newfd)
{
//判断登录是否正确
char* errmsg = NULL;
char** pres = NULL;
int row,column;
char sql[64] = "SELECT * FROM user;";
if(sqlite3_get_table(db,sql,&pres,&row,&column,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_get_table:%s\n",errmsg);
return -1;
}
//循环获取user表中的值
int line;
int i = column+2;
for(line=0;line<row;line++)
{
//判断用户名是否正确
if(strcmp(msg.info.name,pres[i])!=0)
{
i += column;
continue;
}
//判断密码是否正确
if(strcmp(msg.info.passwd,pres[i+1])!=0)
{
//密码不正确
bzero(&msg,sizeof(msg));
msg.msgtype = 0;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//向客户端发送登陆成功包
msg.msgtype = 1;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//用户名不存在
bzero(&msg,sizeof(msg));
msg.msgtype = 2;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//普通用户模式
int do_ordinary(sqlite3* db,int newfd)
{
//判断登录是否正确
char* errmsg = NULL;
char** pres = NULL;
int row,column;
char sql[64] = "SELECT * FROM user;";
if(sqlite3_get_table(db,sql,&pres,&row,&column,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_get_table:%s\n",errmsg);
return -1;
}
//循环获取user表中的值
int line;
int i = column+2;
for(line=0;line<row;line++)
{
//判断用户名是否正确
if(strcmp(msg.info.name,pres[i])!=0)
{
i += column;
continue;
}
//判断密码是否正确
if(strcmp(msg.info.passwd,pres[i+1])!=0)
{
//密码不正确
bzero(&msg,sizeof(msg));
msg.msgtype = 0;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//向客户端发送登陆成功包
msg.msgtype = 1;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//用户名不存在
bzero(&msg,sizeof(msg));
msg.msgtype = 2;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//添加
int add_user(sqlite3* db,int newfd)
{
time_t t;
struct tm *tim = NULL;
t = time(NULL);
tim = localtime(&t);
char* errmsg = NULL;
char sql[256] = "";
bzero(sql,sizeof(sql));
sprintf(sql,"insert into user values (\"%d\",\"%d\",\"%s\",\"%s\",\"%d\",\"%s\",\"%s\",\"%s\",\"%s\",\"%d\",\"%f\");",msg.info.id,msg.info.usertype,msg.info.name,msg.info.passwd,msg.info.age,msg.info.phone,msg.info.addr,msg.info.work,msg.info.date,msg.info.level,msg.info.salary);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
return -1;
}
//存入历史记录
bzero(sql,sizeof(sql));
sprintf(sql,"insert into history_Record values (\"%d-%02d-%02d %02d:%02d:%02d\",\"%s\",\"%s添加了用户%s用户\");",tim->tm_year+1900, tim->tm_mon+1, tim->tm_mday,tim->tm_hour, tim->tm_min, tim->tm_sec,his.info.name,his.info.name,msg.info.name);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
//添加成功
bzero(&msg,sizeof(msg));
msg.msgtype = 1;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//查询
int query_info(sqlite3* db,int newfd)
{
//按人名查询
char* errmsg = NULL;
char** pres = NULL;
int row,column;
char sql[128] = "";
sprintf(sql,"SELECT * FROM user where name = \"%s\";",msg.info.name);
if(sqlite3_get_table(db,sql,&pres,&row,&column,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_get_table:%s\n",errmsg);
return -1;
}
//用户名不存在
if(row==0)
{
bzero(&msg,sizeof(msg));
msg.flags = 0;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return -1;
}
//循环获取user表中的值
int line;
int i = column;
bzero(&msg,sizeof(msg));
for(line=0;line<row;line++)
{
msg.info.id = atoi(pres[i]);
msg.info.usertype = atoi(pres[i+1]);
strcpy(msg.info.name,pres[i+2]);
strcpy(msg.info.passwd,pres[i+3]);
msg.info.age = atoi(pres[i+4]);
strcpy(msg.info.phone,pres[i+5]);
strcpy(msg.info.addr,pres[i+6]);
strcpy(msg.info.work,pres[i+7]);
strcpy(msg.info.date,pres[i+8]);
msg.info.level = atoi(pres[i+9]);
//msg.info.salary = pres[i+10];
}
//发送查询成功包
msg.flags = 1;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//查询所有
int query_all(sqlite3* db,int newfd)
{
//判断登录是否正确
char* errmsg = NULL;
char** pres = NULL;
int row,column;
char sql[128] = "SELECT * FROM user;";
if(sqlite3_get_table(db,sql,&pres,&row,&column,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_get_table:%s\n",errmsg);
return -1;
}
//表中无信息
if(row==0)
{
bzero(&msg,sizeof(msg));
msg.msgtype = 0;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
}
//循环获取user表中的值
int line;
int i = column;
for(line=0;line<row;line++)
{
msg.info.id = atoi(pres[i]);
msg.info.usertype = atoi(pres[i+1]);
strcpy(msg.info.name,pres[i+2]);
strcpy(msg.info.passwd,pres[i+3]);
msg.info.age = atoi(pres[i+4]);
strcpy(msg.info.phone,pres[i+5]);
strcpy(msg.info.addr,pres[i+6]);
strcpy(msg.info.work,pres[i+7]);
strcpy(msg.info.date,pres[i+8]);
msg.info.level = atoi(pres[i+9]);
//msg.info.salary = pres[i+10];
//循环发送查询成功包
msg.msgtype = 1;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
i += column;
}
//结束标志位
bzero(&msg,sizeof(msg));
msg.msgtype = 0;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//修改个人信息
int revise_myself(sqlite3* db,int newfd)
{
time_t t;
struct tm *tim = NULL;
t = time(NULL);
tim = localtime(&t);
char* errmsg = NULL;
char sql[256] = "";
if(msg.flags==1)
{
//修改姓名
sprintf(sql,"UPDATE user SET name=\"%s\" WHERE id=\"%d\";",msg.info.name,msg.info.id);
}
else if(msg.flags==2)
{
//修改电话
sprintf(sql,"UPDATE user SET phone=\"%s\" WHERE id=\"%d\";",msg.info.phone,msg.info.id);
}
else if(msg.flags==3)
{
//修改密码
sprintf(sql,"UPDATE user SET password=\"%s\" WHERE id=\"%d\";",msg.info.passwd,msg.info.id);
}
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
if(msg.flags==1)
{
//存入历史记录
bzero(sql,sizeof(sql));
sprintf(sql,"insert into history_Record values (\"%d-%02d-%02d %02d:%02d:%02d\",\"%s\",\"%s修改工号为%d用户的姓名为%s\");",tim->tm_year+1900, tim->tm_mon+1, tim->tm_mday,tim->tm_hour, tim->tm_min, tim->tm_sec,his.info.name,his.info.name,msg.info.id,msg.info.name);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
}
else if(msg.flags==2)
{
//存入历史记录
bzero(sql,sizeof(sql));
sprintf(sql,"insert into history_Record values (\"%d-%02d-%02d %02d:%02d:%02d\",\"%s\",\"%s修改工号为%d用户的电话为%s\");",tim->tm_year+1900, tim->tm_mon+1, tim->tm_mday,tim->tm_hour, tim->tm_min, tim->tm_sec,his.info.name,his.info.name,msg.info.id,msg.info.phone);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
}
else if(msg.flags==3)
{
//存入历史记录
bzero(sql,sizeof(sql));
sprintf(sql,"insert into history_Record values (\"%d-%02d-%02d %02d:%02d:%02d\",\"%s\",\"%s修改工号为%d用户的密码为%s\");",tim->tm_year+1900, tim->tm_mon+1, tim->tm_mday,tim->tm_hour, tim->tm_min, tim->tm_sec,his.info.name,his.info.name,msg.info.id,msg.info.passwd);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
}
return 0;
}
//修改
int revise_info(sqlite3* db,int newfd)
{
time_t t;
struct tm *tim = NULL;
t = time(NULL);
tim = localtime(&t);
char* errmsg = NULL;
char sql[256] = "";
if(msg.flags==1)
{
//修改姓名
sprintf(sql,"UPDATE user SET name=\"%s\" WHERE id=\"%d\";",msg.info.name,msg.info.id);
}
else if(msg.flags==2)
{
//修改电话
sprintf(sql,"UPDATE user SET phone=\"%s\" WHERE id=\"%d\";",msg.info.phone,msg.info.id);
}
else if(msg.flags==3)
{
//修改职位
sprintf(sql,"UPDATE user SET work=\"%s\" WHERE id=\"%d\";",msg.info.work,msg.info.id);
}
else if(msg.flags==4)
{
//修改密码
sprintf(sql,"UPDATE user SET password=\"%s\" WHERE id=\"%d\";",msg.info.passwd,msg.info.id);
}
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
if(msg.flags==1)
{
//存入历史记录
bzero(sql,sizeof(sql));
sprintf(sql,"insert into history_Record values (\"%d-%02d-%02d %02d:%02d:%02d\",\"%s\",\"%s修改工号为%d用户的姓名为%s\");",tim->tm_year+1900, tim->tm_mon+1, tim->tm_mday,tim->tm_hour, tim->tm_min, tim->tm_sec,his.info.name,his.info.name,msg.info.id,msg.info.name);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
}
else if(msg.flags==2)
{
//存入历史记录
bzero(sql,sizeof(sql));
sprintf(sql,"insert into history_Record values (\"%d-%02d-%02d %02d:%02d:%02d\",\"%s\",\"%s修改工号为%d用户的电话为%s\");",tim->tm_year+1900, tim->tm_mon+1, tim->tm_mday,tim->tm_hour, tim->tm_min, tim->tm_sec,his.info.name,his.info.name,msg.info.id,msg.info.phone);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
}
else if(msg.flags==3)
{
//存入历史记录
bzero(sql,sizeof(sql));
sprintf(sql,"insert into history_Record values (\"%d-%02d-%02d %02d:%02d:%02d\",\"%s\",\"%s修改工号为%d用户的职位为%s\");",tim->tm_year+1900, tim->tm_mon+1, tim->tm_mday,tim->tm_hour, tim->tm_min, tim->tm_sec,his.info.name,his.info.name,msg.info.id,msg.info.work);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
}
else if(msg.flags==4)
{
//存入历史记录
bzero(sql,sizeof(sql));
sprintf(sql,"insert into history_Record values (\"%d-%02d-%02d %02d:%02d:%02d\",\"%s\",\"%s修改工号为%d用户的密码为%s\");",tim->tm_year+1900, tim->tm_mon+1, tim->tm_mday,tim->tm_hour, tim->tm_min, tim->tm_sec,his.info.name,his.info.name,msg.info.id,msg.info.passwd);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
}
return 0;
}
//删除
int Record_user(sqlite3* db,int newfd)
{
time_t t;
struct tm *tim = NULL;
t = time(NULL);
tim = localtime(&t);
char* errmsg = NULL;
char sql[256] = "";
//删除
sprintf(sql,"DELETE FROM user WHERE id=\"%d\";",msg.info.id);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
//存入历史记录
bzero(sql,sizeof(sql));
sprintf(sql,"insert into history_Record values (\"%d-%02d-%02d %02d:%02d:%02d\",\"%s\",\"%s删除了%s用户\");",tim->tm_year+1900, tim->tm_mon+1, tim->tm_mday,tim->tm_hour, tim->tm_min, tim->tm_sec,his.info.name,his.info.name,msg.info.name);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_exec:%s\n",errmsg);
return -1;
}
//结束标志位
bzero(&msg,sizeof(msg));
msg.msgtype = 1;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//查询历史记录
int history_Record(sqlite3* db,int newfd)
{
//判断登录是否正确
char* errmsg = NULL;
char** pres = NULL;
int row,column;
char sql[128] = "SELECT * FROM history_Record;";
if(sqlite3_get_table(db,sql,&pres,&row,&column,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"sqlite3_get_table:%s\n",errmsg);
return -1;
}
//表中无信息
if(row==0)
{
bzero(&msg,sizeof(msg));
msg.msgtype = 0;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
//循环获取user表中的值
int line;
int i = column;
for(line=0;line<row;line++)
{
strcpy(msg.info.date,pres[i]);
strcpy(msg.info.name,pres[i+1]);
strcpy(msg.recvmsg,pres[i+2]);
//循环发送查询成功包
msg.msgtype = 1;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
i += column;
}
//结束标志位
bzero(&msg,sizeof(msg));
msg.msgtype = 0;
if(send(newfd,&msg,sizeof(msg),0)<0)
{
perror("send");
return -1;
}
return 0;
}
客户端
fun.h
#ifndef __FUN_H__
#define __FUN_H__
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <dirent.h>
#include <errno.h>
#include <strings.h>
#include <sqlite3.h>
typedef struct staff_info{
int id; // 员工编号
int usertype; // ADMIN 0 USER 1
char name[20]; // 姓名
char passwd[20]; // 密码
int age; // 年龄
char phone[20]; // 电话
char addr[64]; // 地址
char work[20]; // 职位
char date[20]; // 入职年月
int level; // 等级
double salary ; // 工资
}staff_info_t;
typedef struct {
int msgtype; //请求的消息类型
int usertype; //ADMIN 1 USER 2
char username[20]; //姓名
char passwd[20]; //登陆密码
char recvmsg[64]; //通信的消息
int flags; //标志位
staff_info_t info; //员工信息
}MSG;
#define PORT 8881
#define IP "192.168.250.100"
//设置网络属性并连接服务器
int set_network(int sfd);
//管理用户模式
int do_administrator(int sfd);
//普通用户模式
int do_ordinary(int sfd);
//添加
int add_user(int sfd);
//查询
int query_info(int sfd);
//按人名查找
int query_name(int sfd);
//查找所有
int query_all(int sfd);
//查询个人信息
int query_myself(int sfd);
//修改
int revise_info(int sfd);
//修改个人信息
int revise_myself(int sfd);
//删除
int Record_user(int sfd);
//查询历史纪录
int history_Record(int sfd);
#endif
main.c
#include "fun.h"
MSG msg;
int main(int argc, const char *argv[])
{
//创建流试套接字
int sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
perror("socket");
return -1;
}
//设置网络属性并连接服务器
set_network(sfd);
char a = 0;
while(1)
{
system("clear");
printf("------------------\n");
printf(" 1.管理用户模式 \n");
printf(" 2.普通用户模式 \n");
printf(" 3.退出 \n");
printf("------------------\n");
printf("请选择:");
a = getchar();
while(getchar()!=10);
switch(a)
{
case '1':
//管理用户模式
do_administrator(sfd);
break;
case '2':
//普通用户模式
do_ordinary(sfd);
break;
case '3':
//退出
goto END;
default:
printf("输入有误,请重新选择!\n");
}
printf("输入任意字符清屏:");
while(getchar()!=10);
}
END:
close(sfd);
return 0;
}
fun.c
#include "fun.h"
extern MSG msg;
// 设置网络属性并连接服务器
int set_network(int sfd)
{
// 允许端口快速被重用
int reuse = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
perror("setsockopt");
return -1;
}
// 获取服务器地址信息的结构体
struct sockaddr_in sin;
socklen_t addrlen = sizeof(sin);
sin.sin_family = AF_INET; // 必须填AF_INET
sin.sin_port = htons(PORT); // 端口号的网络字节序;(1024~49151)
sin.sin_addr.s_addr = inet_addr(IP); // 本机IP地址
// 连接服务器
if (connect(sfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{
perror("connect");
return -1;
}
return 0;
}
// 管理用户模式
int do_administrator(int sfd)
{
// 构造登录包
msg.msgtype = 0;
printf("请输入用户名:");
scanf("%s", msg.info.name);
printf("请输入密码:");
scanf("%s", msg.info.passwd);
while (getchar() != 10);
// 向服务器发送登录功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
// 接收服务器功能包
if (recv(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("recv");
return -1;
}
// 判断服务器的登录包类型
if (msg.msgtype == 2)
{
printf("用户名不存在!\n");
return -1;
}
else if (msg.msgtype == 0)
{
printf("密码错误!\n");
return -1;
}
else if (msg.msgtype == 3)
{
printf("您不是管理员!\n");
return -1;
}
else if (msg.msgtype == 1)
{
printf("登陆成功!\n");
}
sleep(1);
char a = 0;
while (1)
{
system("clear");
printf("-----------------\n");
printf(" 1.查询 \n");
printf(" 2.修改 \n");
printf(" 3.添加 \n");
printf(" 4.删除 \n");
printf(" 5.查询历史纪录 \n");
printf(" 6.返回上一级 \n");
printf("-----------------\n");
printf("请选择:");
a = getchar();
while (getchar() != 10);
switch (a)
{
case '1':
// 查询
query_info(sfd);
break;
case '2':
// 修改
revise_info(sfd);
break;
case '3':
// 添加
add_user(sfd);
break;
case '4':
// 删除
Record_user(sfd);
break;
case '5':
// 查询历史纪录
history_Record(sfd);
break;
case '6':
// 返回上一级
return -1;
default:
printf("输入有误,请重新选择!\n");
}
printf("输入任意字符清屏:");
while (getchar() != 10);
}
return 0;
}
//普通用户模式
int do_ordinary(int sfd)
{
// 构造登录包
msg.msgtype = 1;
printf("请输入用户名:");
scanf("%s", msg.info.name);
printf("请输入密码:");
scanf("%s", msg.info.passwd);
while (getchar() != 10);
// 向服务器发送登录功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
// 接收服务器功能包
if (recv(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("recv");
return -1;
}
// 判断服务器的登录包类型
if (msg.msgtype == 2)
{
printf("用户名不存在!\n");
return -1;
}
else if (msg.msgtype == 0)
{
printf("密码错误!\n");
return -1;
}
else if (msg.msgtype == 3)
{
printf("您不是管理员!\n");
return -1;
}
else if (msg.msgtype == 1)
{
printf("登陆成功!\n");
}
sleep(1);
char a = 0;
while (1)
{
system("clear");
printf("-----------------\n");
printf(" 1.查询个人信息 \n");
printf(" 2.修改个人信息 \n");
printf(" 3.返回上一级 \n");
printf("-----------------\n");
printf("请选择:");
a = getchar();
while (getchar() != 10);
switch (a)
{
case '1':
// 查询个人信息
query_myself(sfd);
break;
case '2':
// 修改个人信息
revise_myself(sfd);
break;
case '3':
// 返回上一级
return -1;
default:
printf("输入有误,请重新选择!\n");
}
printf("输入任意字符清屏:");
while (getchar() != 10);
}
return 0;
}
//查询个人信息
int query_myself(int sfd)
{
// 构造查询包
msg.msgtype = 2;
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
// 接收服务器功能包
bzero(&msg, sizeof(msg));
if (recv(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("recv");
return -1;
}
// 判断服务器包类型
if (msg.flags == 1)
{
printf("工号:%d 姓名:%s 电话:%s 职位:%s\n", msg.info.id, msg.info.name, msg.info.phone, msg.info.work);
}
else if (msg.flags == 0)
{
printf("用户名不存在!\n");
return -1;
}
return 0;
}
// 添加
int add_user(int sfd)
{
char chose;
// 构造用户信息包
bzero(&msg, sizeof(msg));
msg.msgtype = 4;
printf("请输入工号:");
scanf("%d", &msg.info.id);
while (getchar() != 10);
printf("请输入用户名:");
scanf("%s", msg.info.name);
while (getchar() != 10);
printf("请输入密码:");
scanf("%s", msg.info.passwd);
while (getchar() != 10);
printf("请输入年龄:");
scanf("%d", &msg.info.age);
while (getchar() != 10);
printf("请输入电话:");
scanf("%s", msg.info.phone);
while (getchar() != 10);
printf("请输入家庭住址:");
scanf("%s", msg.info.addr);
while (getchar() != 10);
printf("请输入职位:");
scanf("%s", msg.info.work);
while (getchar() != 10);
printf("请输入入职日期:");
scanf("%s", msg.info.date);
while (getchar() != 10);
printf("请输入评级:");
scanf("%d", &msg.info.level);
while (getchar() != 10);
printf("请输入工资:");
scanf("%lf", &msg.info.salary);
while (getchar() != 10);
printf("是否设为管理员(Y/N):");
scanf("%c", &chose);
while (getchar() != 10);
if (chose == 'y' || chose == 'Y')
{
msg.info.usertype = 0;
}
else
{
msg.info.usertype = 1;
}
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
// 接收服务器功能包
bzero(&msg, sizeof(msg));
if (recv(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("recv");
return -1;
}
// 判断服务器包类型
if (msg.msgtype == 1)
{
printf("登陆成功!\n");
}
return 0;
}
// 查询
int query_info(int sfd)
{
char a = 0;
while (1)
{
system("clear");
printf("------------------\n");
printf(" 1.按人名查找 \n");
printf(" 2.查找所有 \n");
printf(" 3.返回上一级 \n");
printf("------------------\n");
printf("请选择:");
a = getchar();
while (getchar() != 10);
switch (a)
{
case '1':
// 按人名查找
query_name(sfd);
break;
case '2':
// 查找所有
query_all(sfd);
break;
case '3':
// 返回上一级
return -1;
default:
printf("输入有误,请重新选择!\n");
}
printf("输入任意字符清屏:");
while (getchar() != 10);
}
}
// 按人名查找
int query_name(int sfd)
{
// 构造查询包
bzero(&msg, sizeof(msg));
msg.msgtype = 2;
printf("请输入您要查找的用户名:");
scanf("%s", msg.info.name);
while (getchar() != 10);
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
// 接收服务器功能包
bzero(&msg, sizeof(msg));
if (recv(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("recv");
return -1;
}
// 判断服务器包类型
if (msg.flags == 1)
{
printf("工号:%d 姓名:%s 电话:%s 职位:%s\n", msg.info.id, msg.info.name, msg.info.phone, msg.info.work);
}
else if (msg.flags == 0)
{
printf("用户名不存在!\n");
return -1;
}
return 0;
}
// 查找所有
int query_all(int sfd)
{
// 构造查询包
bzero(&msg, sizeof(msg));
msg.msgtype = 8;
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
// 接收服务器功能包
for (int i = 0; i < 50; i++)
{
bzero(&msg, sizeof(msg));
if (recv(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("recv");
return -1;
}
// 判断服务器包类型
if (msg.msgtype == 1)
{
printf("工号:%d 姓名:%s 电话:%s 职位:%s\n", msg.info.id, msg.info.name, msg.info.phone, msg.info.work);
}
else if (msg.msgtype == 0)
{
return -1;
}
}
return 0;
}
//修改个人信息
int revise_myself(int sfd)
{
char a;
bzero(&msg, sizeof(msg));
msg.msgtype = 9;
printf("请输入您要修改的工号:");
scanf("%d", &msg.info.id);
while (getchar() != 10);
while (1)
{
system("clear");
printf("****************请输入要修改的选项***************\n");
printf("****** 1:姓名 2:电话 3:密码 4:返回上一级 *******\n");
printf("***********************************************\n");
printf("请选择:");
a = getchar();
while (getchar() != 10);
switch (a)
{
case '1':
// 修改姓名
printf("请输入姓名:");
scanf("%s", msg.info.name);
while (getchar() != 10);
msg.flags = 1;
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
printf("修改成功!\n");
break;
case '2':
// 修改电话
printf("请输入电话:");
scanf("%s", msg.info.phone);
while (getchar() != 10);
msg.flags = 2;
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
printf("修改成功!\n");
break;
case '3':
// 修改密码
printf("请输入密码:");
scanf("%s", msg.info.passwd);
while (getchar() != 10);
msg.flags = 3;
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
printf("修改成功!\n");
break;
case '4':
// 返回上一级
return -1;
default:
printf("输入有误,请重新选择!\n");
}
printf("输入任意字符清屏:");
while (getchar() != 10);
}
return 0;
}
// 修改
int revise_info(int sfd)
{
char a;
bzero(&msg, sizeof(msg));
msg.msgtype = 3;
printf("请输入您要修改的工号:");
scanf("%d", &msg.info.id);
while (getchar() != 10);
while (1)
{
system("clear");
printf("*******************请输入要修改的选项***************\n");
printf("****** 1:姓名 2:电话 3:职位 4:密码 5:返回上一级 ****\n");
printf("***************************************************\n");
printf("请选择:");
a = getchar();
while (getchar() != 10);
switch (a)
{
case '1':
// 修改姓名
printf("请输入姓名:");
scanf("%s", msg.info.name);
while (getchar() != 10);
msg.flags = 1;
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
printf("修改成功!\n");
break;
case '2':
// 修改电话
printf("请输入电话:");
scanf("%s", msg.info.phone);
while (getchar() != 10);
msg.flags = 2;
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
printf("修改成功!\n");
break;
case '3':
// 修改职位
printf("请输入职位:");
scanf("%s", msg.info.work);
while (getchar() != 10);
msg.flags = 3;
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
printf("修改成功!\n");
break;
case '4':
// 修改密码
printf("请输入密码:");
scanf("%s", msg.info.passwd);
while (getchar() != 10);
msg.flags = 4;
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
printf("修改成功!\n");
break;
case '5':
// 返回上一级
return -1;
default:
printf("输入有误,请重新选择!\n");
}
printf("输入任意字符清屏:");
while (getchar() != 10);
}
return 0;
}
// 删除
int Record_user(int sfd)
{
printf("请输入要删除的工号:");
scanf("%d", &msg.info.id);
while (getchar() != 10)
;
msg.msgtype = 5;
// 向服务器发送删除功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
bzero(&msg, sizeof(msg));
if (recv(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("recv");
return -1;
}
if (msg.msgtype == 1)
{
printf("删除成功!\n");
return -1;
}
else
{
printf("删除失败!\n");
return -1;
}
return 0;
}
// 查询历史纪录
int history_Record(int sfd)
{
// 构造查询包
bzero(&msg, sizeof(msg));
msg.msgtype = 6;
// 向服务器发送用户信息功能包
if (send(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("send");
return -1;
}
// 接收服务器功能包
for (int i = 0; i < 50; i++)
{
bzero(&msg, sizeof(msg));
if (recv(sfd, &msg, sizeof(msg), 0) < 0)
{
perror("recv");
return -1;
}
// 判断服务器包类型
if (msg.msgtype == 1)
{
printf("%s----%s----%s\n", msg.info.date, msg.info.name, msg.recvmsg);
}
else if (msg.msgtype == 0)
{
printf("输入任意字符清屏:");
while (getchar() != 10)
;
return -1;
}
}
return 0;
}