这俩天写了一个小玩具程序,算一个长期以来的热门题目就是《xxx管理系统》。大致的意思整个程序分为客户端和服务器段,客户端通过登录验证后,对信息进行处理,并且客户端分为了普通用户和管理员。至于员工信息这些数据,舍弃了数据库的做法,改用读写普通文件的方式存放数据。
使用流程大致如下图所示
而服务器端和客户端都有不同的设计流程
客户端主要为,用户登录,录入或者查询信息,发送到服务器端,接收服务器端返回的消息
服务器端主要为,监听客户端连接,接收客户端消息,根据消息类型做出不同的操作,并更新存储信息的文件,发送反馈信息到客户端。
为此我们需要封装一些数据结构。大致有三个:
(1)消息结构体,主要负责携带网络传输的数据,其中包含消息的类型,消息的发送方,用户信息等等。
(2)用户信息结构体,主要为用户的详细信息,用于查看修改。
(3)用户结构体,包含用户名和密码,用于登录。
/**********************************************************/
以下为代码大致框架
1.服务器端
int main(int argc, const char *argv[])
{
pthread_t client_th; //定义线程号
socket_set //tcp网络设置
open the file //打开文件
init the file //初始化文件,写入必要的信息
read the file //重新读取文件,将数据放入内存中
/**socket 编程,循环监听,开启新的线程*/
while(1)
{
if((acceptfd = accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen))<0)
{
errlog("fail to accept");
}
printf("Ip:%s,bind:%d.\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
if(acceptfd>0)
{
pthread_create(&client_th,NULL,(void *)client_fun,(void *)acceptfd);
printf("new thread = %lu join.\n",client_th);
pthread_detach(client_th);
}
}
close(sockfd);
close(fp_info);
close(fp_user);
return 0;
#endif
}
#if 1
/**
*@arg socket描述符
*@brief 开线程与客户端连接
*/
void *client_fun(void *arg)
{
MSG msg; //消息结构体
int acceptfd=(int)arg;
while(1)
{
if(recv(acceptfd,&msg,sizeof(MSG),0)<0)
{
errlog("fail to recv");
}
/**根据消息类型做出不同的操作**/
switch(msg.type)
{
case READ: //查询用户信息
do_selectuser(acceptfd,&msg);break;
case CHANGE: //修改用户信息
do_modifyuser(acceptfd,&msg);break;
case DELETE: //删除用户
do_deluser(acceptfd,&msg);break;
case ADD: //添加用户
do_adduser(acceptfd,&msg);break;
case LOAD: //用户申请登录
do_loaduser(acceptfd,&msg);break;
case QUIT: //用户退出时发给服务器的通知消息
do_quituser(acceptfd,&msg);break;
default:
break;
}
}
close(acceptfd);
return NULL;
}
#endif
/**用户登录申请处理*/
int do_loaduser(int sockfd, MSG *msg)
{
}
/**申请新增用户处理*/
int do_adduser(int sockfd, MSG *msg)
{
}
/**申请修改用户信息处理*/
int do_modifyuser(int sockfd, MSG *msg)
{
}
/**申请查看用户信息处理*/
int do_selectuser(int sockfd, MSG *msg)
{
}
/**用户申请退出处理*/
int do_quituser(int sockfd, MSG *msg)
{
}
2.客户端
static int status=0; //运行状态
static char user[N_SIZE]={0}; //当前用户名
static int current_no = 0; //当前用户ID
int main(int argc,const char *argv[])
{
socket_set //tcp网络设置
/**发送连接请求*/
if(connect(sockfd, (struct sockaddr *)&serveraddr, addrlen) < 0)
{
errlog("fail to connect");
}
/**连接成功后进入登录页面*/
while(1)
{
while((status==RUN_1)) //初始登录界面
{
my_printf("1.login 2.quit ");
printf("input your choice: ");
scanf("%d",&cho_num);
REMLINE;
switch(cho_num)
{
case 1:
do_login(sockfd,msg);break; //选择登录
case 2:
do_quit(sockfd,msg);break; //选择退出
default:
puts("input error,please try again");
break;
}
}
while((status==RUN_2)) //管理员登录后的操作界面
{
my_printf("1.add 2.delete 3.modify 4.select 5.quit");
printf("input your choice:");
scanf("%d",&cho_num);
REMLINE;
switch(cho_num)
{
case 1:
do_add(sockfd,msg);break; //申请添加用户
case 2:
do_delect(sockfd,msg);break; //申请删除用户
case 3:
do_modify(sockfd,msg);break; //申请修改用户
case 4:
do_select(sockfd,msg);break; //申请查询用户
case 5:
do_quit(sockfd,msg);break; //申请退出
default:
puts("input error,please try again:");
break;
}
}
while((status==RUN_3)) ////普通员员登录后的操作界面
{
my_printf("1.modify 2.select 3.quit");
printf("input your choice:");
scanf("%d",&cho_num);
switch(cho_num)
{
case 1:
do_modify(sockfd,msg);break; //申请修改用户
case 2:
do_select(sockfd,msg);break; //申请查询用户
case 3:
do_quit(sockfd,msg);break; //申请退出
default:
puts("input error,please try again:");
break;
}
}
}
close(sockfd);
return 0;
}
/**申请登录*/
int do_login(int sockfd,MSG *msg)
{
}
/**申请增加新的用户*/
int do_add(int sockfd,MSG *msg)
{
}
/**申请查看用户信息,非管理员模式下只能查看自己的信息
*用户名和用户ID(name,和no)全部输入正确才能查看
*/
int do_select(int sockfd,MSG *msg)
{
}
/**申请修改用户信息,非管理员模式下只能修改自己的信息
*用户名和用户ID(name,和no)全部输入正确才能修改
*/
int do_modify(int sockfd,MSG *msg)
{
}
/**申请退出*/
int do_quit(int sockfd,MSG *msg)
{
}
对于读文件的操作,我们使用二进制文件,然后用open,read,write,read。就可以按照先定义好的数据结构,去读写这些文件。
例如操作一个二进制文件,user.dat,我们可以直接按定义好的结构体USER去读写该文件。省去了我们处理文本文件的各种复杂操作。
int main(int argc, const char *argv[])
{
int fp = open("user.dat",O_RDWR);
USER usr[MAX_USR];
int usrlen =sizeof(USER);
int i=0;
while(read(fp,&usr[i],usrlen)!=0);
{
i++;
}
printf("i = %d.\n",i);
while(i--)
{
printf("id = %d.\nname = %s.\npassword = %s.\n",usr[i].type,usr[i].name,usr[i].passwd);
}
close(fp);
return 0;
}
好了,有了这些代码,大家基本就可以写一个xx管理系统了。
最后会有我自己写的程序的下载链接。
http://download.csdn.net/download/u010916862/9896853