Linux多线程编程之员工信息管理系统

       员工信息管理系统是基于Linux 多线程并发服务器编程,由服务器端和客户端构成,客户端可以运行在多个不同的主机上连接服务器,服务器对员工信息的操作结果通过“员工信息文件”来保存,即:“员工信息”存放在后台的文件中,相当于数据库。当用户登录后,根据用户名判断用户是否为管理员。如果为管理员,则进入管理员目录,如果为普通员工,则进入员工目录。在管理员目录,可以查看任意员工的信息,还可修改员工的信息,包括工资、评级,添加或删除用户。在员工目录,可以查看自己的信息,不能查看其他人的信息,可以修改自己的电话,地址等个人信息,但不能修改工资等管理员权限信息。

       员工信息管理系统采用TCP协议,将在客户端采集的信息打包成结构体MSG,将MSG传送到服务器,服务器通过对MSG的解析,执行相关的操作,并把客户端请求的数据打包成结构体MSG发送给客户端,实现员工信息的管理。

(1) 客户端模块,通过对用户名的判断,判断用户是否为管理员,从而提供不同的接口,并将用户的请求打包为MSG结构体,发送给服务器。采用统一的结构体MSG在服务器与客户端进行信息交流,可以统一接口,方便信息分析。

(2)服务器模块,通过对结构体MSG的分析,对客户端的请求新建子进程来处理客户端的请求,实现多用户。



服务器端

服务器端是员工和管理员的数据信息存储区。服务器负责通过判断客户端一系列请求,对数据做出相应的操作。

主要包含服务器通讯模块、服务器数据库处理模块。服务器端功能描述如下:

(1) 打开服务器:

打开服务器时,打开数据文件和网络通讯,并对网络进行监听。

(2) 收到客户端数据:

从服务器接受到数据后先判断登陆结构体是否有变化,如果有变化,表示有新用户登陆,则创建一个子进程,如果没有变化则表示无用户登陆或收到数据为已登录用户的数据。如果是用户登陆,则判断是否是管理员账户。通过接受客户端请求操作数据文件,完成后将结果发送给客户端,并返回等待下次的数据到来,如果出现错误,则发送错误信息给客户端。


员工客户端

员工和管理员通过客户端登陆后执行操作。不同的是在通过姓名验证的时候,系统会自动判断登陆者身份,以辨认是普通用户还是系统管理员。通过不同类别用户的登录从而实现不同的操作。普通用户有如下操作:查看和修改自身的信息。系统管理员有如下操作:查看所有用户信息及对用户信息的增,删,改,查。用户信息根据用户需求设定,初步设计包含员工编号,用户名,联系电话,住址,年龄,工资情况,员工评级七项。其中工资情况和员工评级为只有管理员权限可修改项。

客户端主要包括用户登录模块、用户权限选择模块、用户信息的操作请求模块和退出程序几部分。

(1)登录模块:连接上服务器之后进入登录模块,提示用户输入用户名和密码。如果用户名和密码正确则登录成功进入相应的界面,否则返回登录界面。

(2)用户权限选择模块:用户登录成功之后,经过服务器端判断决定用户进入对应权限的界面。

(3)用户信息操作模块:如果进入的是管理员界面则管理员过姓名选择相应的员工信息后,具有添加用户、删除用户、修改用户信息、查询用户信息四项权限。如果进入的时普通用户界面则该用户仅具有修改个人信息(包含修改密码)、查询用户信息两项权限。向服务器发送相应的请求,实现功能。

(4)退出程序:当用户操作结束之后退出程序,也可返回上一层目录。

源代码

服务器

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <strings.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <pthread.h>
#include <unistd.h>
#include "head.h"

typedef struct sockaddr SA;
int     Info_rmark = 0;//文件Info.text互斥操作的读
int     Info_wmark = 0;//文件Info.text互斥操作的写
int     User_rmark = 0;//文件User.text互斥操作的读
int     User_wmark = 0;//文件User.text互斥操作的写

void findMsg(MSG *);
void findUser(MSG *);
void addMsg(MSG *);
void addUser(MSG *);
void delMsg(MSG *);
void delUser(MSG *);


void* handler(void * arg)//接收客户端消息,判断消息类型
{
	MSG  msg;
	int n;
	int connfd = (int)arg;
	while(1)
	{
		n = recv(connfd,&msg, sizeof(MSG), 0);
		printf("get message from %s   type:%d  sign:%d\n",msg.name,msg.type,msg.sign);
		if(msg.type == QUIT)
		{
			printf("user %s quit!\n",msg.name);
			pthread_exit(NULL);
			close(connfd);
		}
		if(n == -1)
			break;
		if(msg.type == QUIT)
			break;
		getMsg(&msg);//取得客户端先要的信息,或者修改信息
		printf("send message to %s    type:%d   sign:%d\n\n",msg.name,msg.type,msg.sign);
		send(connfd,&msg, sizeof(MSG), 0);
	}

	close(connfd);
	pthread_exit(NULL);

}
int main(int argc, const char *argv[])//./server 127.0.0.1 10001
{
#if 0 
	USER user;
	strcpy(user.name,"zx");
	strcpy(user.passwd,"123");
	user.type = 11;
	user.no = 100;

	FILE * fp = fopen("./user.dat","wb");
	fwrite(&(user),sizeof(USER),1,fp);//写文件
	fclose(fp);
#endif

	int listenfd, connfd;
	
	struct sockaddr_in ser_addr, cli_addr;

	if(argc != 3)
	{
		printf("plz input %s <ip> <port>\n", argv[0]);
		exit(-1);
	}

	if((listenfd = socket(AF_INET, SOCK
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值