基于TCP员工管理系统项目

服务器

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值