头文件:head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sqlite3.h>
#include <pthread.h>
#include <sys/un.h>
#include <time.h>
#define N 1024
//协议
#define ADMIN 0//管理员
#define DL 1//登录
#define CX 2//查询
#define XG 3//修改
#define TJ 4//添加
#define SC 5//删除
#define LS 6//历史记录
#define TC 7//退出
#define SB 8//失败
#define CG 9//成功
#define UCX 10//
#define UXG 11//
#define ERR_LOG(msg) do{\
printf("%d %s %s \n", __LINE__, __func__, __FILE__);\
perror(msg);\
}while(0)
#define ERR_MSG(msg) do{\
fprintf(stderr,"__%d__",__LINE__);\
perror(msg);\
}while(0)
#define PORT 8080
//收发用户信息的结构体
typedef struct{
int type;//通信请求(1~9)
char name[20];//姓名
char pass[20];//密码
char text[N];//内容
char gh[10]; //工号
char xm[20]; //姓名
char nl[3]; //年龄
char dh[13]; //电话
char dz[20]; //地址
char zw[20]; //职位
char gz[10]; //工资
char xp[4]; //评级
char bm[20]; //入职日期
char gl[3];//admin
char zx[3];//
}MSG;
#endif
客户端文件:2.c
#include "head.h"
int main(int argc, const char *argv[])
{
int sfd = socket(AF_UNIX,SOCK_STREAM,0);//创建流式套接字
if(sfd < 0){
ERR_MSG("socket");
return -1;
}
struct sockaddr_un sin;//填充客户端地址信息结构体
sin.sun_family = AF_UNIX;
strcpy(sin.sun_path,"./unix");
if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)//连接
{
ERR_MSG("connect");
return -1;
}
printf("连接服务器成功\n");
char buf[128]="";
ssize_t res = 0;
MSG msg;
struct sockaddr_in fin;
socklen_t flen = sizeof(fin);
int recv_flen =-1;
int dm=-1;
while(1)
{
printf("-----------------\n");
printf("-----1、管理员-----\n");
printf("-----2、登录-----\n");
printf("-----3、退出-----\n");
printf("-----------------\n");
printf("请输入>>>");
char choose = getchar();
while(getchar()!=10);
switch(choose)
{
case '1': //管理员
msg.type = htonl(ADMIN);
printf("请输入账号>>>");
fgets(msg.name, 20, stdin);
msg.name[strlen(msg.name)-1] = 0;
printf("请输入密码>>>");
fgets(msg.pass, 20, stdin);
msg.pass[strlen(msg.pass)-1] = 0;
if(send(sfd, &msg, sizeof(msg), 0) < 0)//发送登录信息sendto
{
ERR_LOG("send");
return -1;
}
recv_flen = recvfrom(sfd, &msg, sizeof(msg), 0, (void*)&fin, &flen);
if(recv_flen < 0){
ERR_LOG("recvfrom");
return -1;
}
dm = ntohl(msg.type);//提取出协议//将网络字节序转换为主机字节序
switch(dm)
{
case SB:
printf("管理员登录失败!!\n");
break;
case CG:
printf("管理员登录成功!!\n");
while(1)
{
printf("-------------------------\n");
printf("---------1、添加---------\n");
printf("---------2、查询---------\n");
printf("---------3、修改---------\n");
printf("---------4、删除---------\n");
printf("---------5、历史记录-----\n");
printf("---------6、退出登录-----\n");
printf("-------------------------\n");
printf("请输入>>>");
char cz_admin= getchar();
while(getchar()!=10);
switch(cz_admin)
{
case '1': //添加
msg.type = htonl(TJ);
printf("请输入账号>>>");
fgets(msg.name, 20, stdin);
msg.name[strlen(msg.name)-1] = 0;
printf("请输入密码>>>");
fgets(msg.pass, 20, stdin);
msg.pass[strlen(msg.pass)-1] = 0;
//从终端获取信息
printf("请输入:工号(4位)>>>");
bzero(msg.gh,10);
fgets(msg.gh,10,stdin);
msg.gh[strlen(msg.gh)-1] = 0;
printf("请输入:是否为管理员(1/0)>>>");
fgets(msg.gl,3,stdin);
msg.gl[strlen(msg.gl)-1] = 0;
printf("请输入:在线(1/0)>>>");
fgets(msg.zx,3,stdin);
msg.zx[strlen(msg.zx)-1] = 0;
printf("请输入:姓名>>>");
bzero(msg.xm, 20);
fgets(msg.xm, 20 ,stdin);
msg.xm[strlen(msg.xm)-1] = 0;
printf("请输入:性别>>>");
bzero(msg.nl, 3);
fgets(msg.nl, 3 ,stdin);
msg.nl[strlen(msg.nl)-1] = 0;
printf("请输入:电话>>>");
bzero(msg.dh, 13);
fgets(msg.dh, 13 ,stdin);
msg.dh[strlen(msg.dh)-1] = 0;
printf("请输入:职位>>>");
bzero(msg.dz, 20);
fgets(msg.dz, 20 ,stdin);
msg.dz[strlen(msg.dz)-1] = 0;
printf("请输入:工资>>>");
bzero(msg.gz, 10);
fgets(msg.gz, N ,stdin);
msg.gz[strlen(msg.gz)-1] = 0;
printf("请输入:评价>>>");
bzero(msg.xp, 4);
fgets(msg.xp, 4 ,stdin);
msg.xp[strlen(msg.xp)-1] = 0;
printf("请输入:日期>>>");
bzero(msg.bm, 20);
fgets(msg.bm, 20 ,stdin);
msg.bm[strlen(msg.bm)-1] = 0;
if(send(sfd, &msg, sizeof(msg), 0) < 0)
{
ERR_LOG("sendto");
return -1;
}
break;
case '2': //查看
msg.type = htonl(CX);
//发送
if(send(sfd, &msg, sizeof(msg), 0) < 0)
{
ERR_LOG("sendto");
return -1;
}
int recv_flen=-1;
while(1)
{
recv_flen = recv(sfd, &msg, sizeof(msg),0);
if(recv_flen < 0)
{
ERR_LOG("recv");
return -1;
}
if(strcmp(msg.text,"OK")==0)
{
goto END9;
}
printf("%s\n",msg.text);
}
END9:
break;
case '3': //修改
msg.type = htonl(XG);
printf("请输入:工号(4位)(不可改)>>>\n");
bzero(msg.gh,10);
fgets(msg.gh,10,stdin);
msg.gh[strlen(msg.gh)-1] = 0;
printf("请输入:是否为管理员(1/0)>>>\n");
fgets(msg.gl,3,stdin);
msg.gl[strlen(msg.gl)-1] = 0;
printf("请输入:在线(1/0)>>>\n");
fgets(msg.zx,3,stdin);
msg.zx[strlen(msg.zx)-1] = 0;
printf("请输入密码账号>>>");
fgets(msg.name, 20, stdin);
msg.name[strlen(msg.name)-1] = 0;
printf("请输入密码>>>");
fgets(msg.pass, 20, stdin);
msg.pass[strlen(msg.pass)-1] = 0;
printf("请输入:姓名>>>\n");
bzero(msg.xm, 20);
fgets(msg.xm, 20 ,stdin);
msg.xm[strlen(msg.xm)-1] = 0;
printf("请输入:性别>>>\n");
bzero(msg.nl, 3);
fgets(msg.nl, 3 ,stdin);
msg.nl[strlen(msg.nl)-1] = 0;
printf("请输入:电话>>>\n");
bzero(msg.dh, 13);
fgets(msg.dh, 13 ,stdin);
msg.dh[strlen(msg.dh)-1] = 0;
printf("请输入:职位>>>\n");
bzero(msg.dz, 20);
fgets(msg.dz, 20 ,stdin);
msg.dz[strlen(msg.dz)-1] = 0;
printf("请输入:工资>>>\n");
bzero(msg.gz, 10);
fgets(msg.gz, N ,stdin);
msg.gz[strlen(msg.gz)-1] = 0;
printf("请输入:评价>>>\n");
bzero(msg.xp, 4);
fgets(msg.xp, 4 ,stdin);
msg.xp[strlen(msg.xp)-1] = 0;
printf("请输入:日期>>>\n");
bzero(msg.bm, 20);
fgets(msg.bm, 20 ,stdin);
msg.bm[strlen(msg.bm)-1] = 0;
if(send(sfd, &msg, sizeof(msg), 0) < 0)
{
ERR_LOG("sendto");
return -1;
}
break;
case '4': //删除
msg.type = htonl(SC);
printf("请输入:工号(4位)>>>\n");
bzero(msg.gh,10);
fgets(msg.gh,10,stdin);
msg.gh[strlen(msg.gh)-1] = 0;
if(send(sfd, &msg, sizeof(msg), 0) < 0)
{
ERR_LOG("sendto");
return -1;
}
break;
case '5'://历史记录
msg.type = htonl(LS);
//发送
if(send(sfd, &msg, sizeof(msg), 0) < 0)
{
ERR_LOG("sendto");
return -1;
}
int recv_ls=-1;
while(1)
{
recv_ls = recv(sfd, &msg, sizeof(msg),0);
if(recv_ls < 0)
{
ERR_LOG("recv");
return -1;
}
if(strcmp(msg.text,"OK")==0)
{
goto END8;
}
printf("%s\n",msg.text);
}
END8:
break;
case '6'://退出
msg.type = htonl(TC);
//发送
if(send(sfd, &msg, sizeof(msg), 0) < 0)
{
ERR_LOG("sendto");
return -1;
}
goto END1;
default:
printf("输入错误,请重新输入\n");
}
}
break;
}
END1:
break;
case '2': //用户
msg.type = htonl(DL);
printf("请输入账号>>>");
fgets(msg.name, 20, stdin);
msg.name[strlen(msg.name)-1] = 0;
printf("请输入密码>>>");
fgets(msg.pass, 20, stdin);
msg.pass[strlen(msg.pass)-1] = 0;
if(send(sfd, &msg, sizeof(msg), 0) < 0)//发送登录信息sendto
{
ERR_LOG("send");
return -1;
}
recv_flen = recvfrom(sfd, &msg, sizeof(msg), 0, (void*)&fin, &flen);
if(recv_flen < 0){
ERR_LOG("recvfrom");
return -1;
}
dm = ntohl(msg.type);//提取出协议//将网络字节序转换为主机字节序
switch(dm)
{
case SB:
printf("用户登录失败!!\n");
break;
case CG:
printf("用户登录成功!!\n");
while(1)
{
printf("-------------------------\n");
printf("---------1、查询---------\n");
printf("---------2、修改---------\n");
printf("---------3、退出登录-----\n");
printf("-------------------------\n");
printf("请输入>>>");
char cz_admin= getchar();
while(getchar()!=10);
switch(cz_admin)
{
case '1': //查看
strcmp(msg.text,"");
msg.type = htonl(UCX);
//发送
if(send(sfd, &msg, sizeof(msg), 0) < 0)
{
ERR_LOG("sendto");
return -1;
}
int recv_one = recv(sfd, &msg, sizeof(msg),0);
if(recv_one < 0)
{
ERR_LOG("recv");
return -1;
}
printf("%s\n",msg.text);
break;
case '2': //修改
msg.type = htonl(UXG);
printf("请输入密码>>>");
fgets(msg.pass, 20, stdin);
msg.pass[strlen(msg.pass)-1] = 0;
printf("请输入姓名>>>");
fgets(msg.xm, 20, stdin);
msg.xm[strlen(msg.xm)-1] = 0;
printf("请输入:电话>>>\n");
bzero(msg.dh, 13);
fgets(msg.dh, 13 ,stdin);
msg.dh[strlen(msg.dh)-1] = 0;
if(send(sfd, &msg, sizeof(msg), 0) < 0)
{
ERR_LOG("sendto");
return -1;
}
break;
case '3'://退出
msg.type = htonl(TC);
//发送
if(send(sfd, &msg, sizeof(msg), 0) < 0)
{
ERR_LOG("sendto");
return -1;
}
goto END2;
default:
printf("输入错误,请重新输入\n");
}
}
break;
}
END2:
break;
case '3': //退出
goto END3;
}
}
END3:
close(sfd);
return 0;
}
服务器文件:1.c
#include "head.h"
#define IP "192.168.8.191"
struct tcpx{
int newfd;
struct sockaddr_un sep;
};
sqlite3* db = NULL;//打开数据库
time_t t;
struct tm *nowtime=NULL;
char newtime[500]="";
int hour=0;
int min=0;
int sec=0;
int do_tj(int sfd, MSG rcv_msg,sqlite3* db)//添加
{
char sql[500] = "";
char* errmsg = NULL;
sprintf(sql, "select * from dict where uname = \"%s\" ;", rcv_msg.name);
char** pres = NULL;
int row, column = 0;
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
return -1;
}
if(row != 0)
{
rcv_msg.type = htonl(SB);
if(send(sfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("sendto");
return -1;
}
return 0;
}
sqlite3_free_table(pres); //释放查询到的结果
bzero(sql,sizeof(sql));
sprintf(sql, "select * from dict where no = \"%s\" ;", rcv_msg.gh);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
return -1;
}
if(row != 0)
{
rcv_msg.type = htonl(SB);
if(send(sfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("sendto");
return -1;
}
return 0;
}
sqlite3_free_table(pres); //释放查询到的结果
bzero(sql,sizeof(sql));
sprintf(sql, "insert into dict values(\"%s\", \"%s\",\"%s\", \"%s\",\"%s\", \"%s\",\"%s\", \"%s\",\"%s\", \"%s\",\"%s\", \"%s\");",rcv_msg.gh,rcv_msg.gl,rcv_msg.zx, rcv_msg.name, rcv_msg.pass,rcv_msg.xm,rcv_msg.nl,rcv_msg.dh,rcv_msg.dz,rcv_msg.gz,rcv_msg.xp,rcv_msg.bm);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
return -1;
}
rcv_msg.type = htonl(CG);
if(send(sfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("sendto");
return -1;
}
return 0;
}
void* rcv_tcp(void* arg)
{
pthread_detach(pthread_self());//分离线程,自己分离自己
struct tcpx msg = *(struct tcpx *)arg;
int newfd = msg.newfd;
struct sockaddr_un sep = msg.sep;
char buf[500] = "";
char sql[500] = "";
char* errmsg = NULL;
MSG rcv_msg;
struct sockaddr_in cin;
socklen_t clen = sizeof(cin);
ssize_t res = 0;
char** pres = NULL;
int row, column = 0;
int i = 0,j=0;
while(1){
//接收消息
res= recv(newfd, &rcv_msg, sizeof(rcv_msg), 0);
if(res <0)
{
ERR_MSG("recv");
break;
}
else if(0 == res)
{
bzero(sql,sizeof(sql));
sprintf(sql, "update dict set flag=\"%d\" where uname=\"%s\";", 0,rcv_msg.name);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
printf("客户端退出:newfd = %d \n",newfd);
break;
}
//提取出协议
//将网络字节序转换为主机字节序
int type = ntohl(rcv_msg.type);
switch(type)
{
case ADMIN:
printf("管理员登录中.......\n");
//判断
sprintf(sql, "select * from dict where uname = \"%s\" and admin = \"%d\" and flag = \"%d\";", rcv_msg.name,1,0);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
goto END1;
}
if(row == 0)//账号
{
rcv_msg.type = htonl(SB);
if(send(newfd,&rcv_msg,sizeof(rcv_msg),0) < 0)
{
ERR_LOG("sendto");
goto END1;
}
printf("账号:");
goto END1;
}
sqlite3_free_table(pres);//释放查询到的结果
bzero(sql,sizeof(sql));
sprintf(sql, "select * from dict where pass = \"%s\";", rcv_msg.pass);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
goto END1;
}
if(column != 12)//密码---*---一个有12项内容
{
rcv_msg.type = htonl(SB);
if(send(newfd,&rcv_msg,sizeof(rcv_msg),0) < 0)
{
ERR_LOG("sendto");
goto END1;
}
printf("密码:");
goto END1;
}
sqlite3_free_table(pres);//释放查询到的结果
//发送登录成功
rcv_msg.type = htonl(CG);
if(send(newfd,&rcv_msg,sizeof(rcv_msg),0) < 0)
{
ERR_MSG("send");
break;
}
bzero(sql,sizeof(sql));
sprintf(sql, "update dict set flag=\"%d\" where uname=\"%s\";", 1,rcv_msg.name);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
bzero(sql,sizeof(sql));
t=time(NULL);
nowtime = localtime(&t);
hour=nowtime->tm_hour;
min=nowtime->tm_min;
sec=nowtime->tm_sec;
sprintf(newtime,"%d:%d:%d",hour,min,sec);
sprintf(sql, "insert into zc values(\"%s\", \"%d\",\"%s\", \"%s\");",newtime,1,rcv_msg.name,"登录");
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
printf("管理员登录成功!!!\n");
break;
END1:
printf("管理员登录失败!!!\n");
break;
case DL:
printf("用户登录中.......\n");
//判断
sprintf(sql, "select * from dict where uname = \"%s\" and admin = \"%d\" and flag = \"%d\";", rcv_msg.name,0,0);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
goto END2;
}
if(row == 0)//账号
{
rcv_msg.type = htonl(SB);
if(send(newfd,&rcv_msg,sizeof(rcv_msg),0) < 0)
{
ERR_LOG("sendto");
goto END2;
}
goto END2;
}
sqlite3_free_table(pres);//释放查询到的结果
bzero(sql,sizeof(sql));
sprintf(sql, "select * from dict where pass = \"%s\";", rcv_msg.pass);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
goto END2;
}
if(column != 12)//密码
{
rcv_msg.type = htonl(SB);
if(send(newfd,&rcv_msg,sizeof(rcv_msg),0) < 0)
{
ERR_LOG("sendto");
goto END2;
}
goto END2;
}
sqlite3_free_table(pres);//释放查询到的结果
//发送登录成功
rcv_msg.type = htonl(CG);
if(send(newfd,&rcv_msg,sizeof(rcv_msg),0) < 0)
{
ERR_MSG("send");
break;
}
bzero(sql,sizeof(sql));
sprintf(sql, "update dict set flag=\"%d\" where uname=\"%s\";", 1,rcv_msg.name);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
bzero(sql,sizeof(sql));
t=time(NULL);
nowtime = localtime(&t);
hour=nowtime->tm_hour;
min=nowtime->tm_min;
sec=nowtime->tm_sec;
sprintf(newtime,"%d:%d:%d",hour,min,sec);
sprintf(sql, "insert into zc values(\"%s\", \"%d\",\"%s\", \"%s\");",newtime,0,rcv_msg.name,"登录");
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
printf("用户登录成功!!!\n");
break;
END2:
printf("用户登录失败!!!\n");
break;
case CX://查询
bzero(sql,sizeof(sql));
sprintf(sql, "select * from dict;");
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
break;
}
//由于row中不包含表头的那一行,但是结果中却有表头那行
//所以,遍历的时候,需要将表头的那一行加上
strcpy(rcv_msg.text,"");
for(i=0; i<(row+1)*column; i++)
{
strcat(rcv_msg.text,pres[i]);
strcat(rcv_msg.text," ");
if((i+1)%column == 0)
{
strcat(rcv_msg.text,"\0");
printf("%s\n",rcv_msg.text);
if(send(newfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("sendto");
break;
}
strcpy(rcv_msg.text,"");
}
}
//释放查询到的结果
sqlite3_free_table(pres);
strcpy(rcv_msg.text,"OK");
if(send(newfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("sendto");
break;
}
bzero(sql,sizeof(sql));
t=time(NULL);
nowtime = localtime(&t);
hour=nowtime->tm_hour;
min=nowtime->tm_min;
sec=nowtime->tm_sec;
sprintf(newtime,"%d:%d:%d",hour,min,sec);
sprintf(sql, "insert into zc values(\"%s\", \"%d\",\"%s\", \"%s\");",newtime,1,rcv_msg.name,"查询");
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
break;
case XG://修改
bzero(sql,sizeof(sql));
sprintf(sql, "select * from dict where no = \"%s\" ;", rcv_msg.gh);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
break;
}
if(row != 1)
{
rcv_msg.type = htonl(SB);
if(send(newfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("send");
break;
}
return 0;
}
sqlite3_free_table(pres); //释放查询到的结果
bzero(sql,sizeof(sql));
sprintf(sql, "update dict set admin=\"%s\" , flag=\"%s\" , uname=\"%s\" , pass=\"%s\" , name =\"%s\" , age=\"%s\" , dh=\"%s\" , zw=\"%s\" ,gz=\"%s\", pj=\"%s\", rq=\"%s\" where no=\"%s\";",rcv_msg.gl,rcv_msg.zx, rcv_msg.name, rcv_msg.pass,rcv_msg.xm,rcv_msg.nl,rcv_msg.dh,rcv_msg.dz,rcv_msg.gz,rcv_msg.xp,rcv_msg.bm,rcv_msg.gh);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
rcv_msg.type = htonl(CG);
if(send(newfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("send");
break;
}
bzero(sql,sizeof(sql));
t=time(NULL);
nowtime = localtime(&t);
hour=nowtime->tm_hour;
min=nowtime->tm_min;
sec=nowtime->tm_sec;
sprintf(newtime,"%d:%d:%d",hour,min,sec);
sprintf(sql, "insert into zc values(\"%s\", \"%d\",\"%s\", \"%s\");",newtime,1,rcv_msg.name,"修改");
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
break;
case TJ://添加
do_tj(newfd,rcv_msg,db);
bzero(sql,sizeof(sql));
t=time(NULL);
nowtime = localtime(&t);
hour=nowtime->tm_hour;
min=nowtime->tm_min;
sec=nowtime->tm_sec;
sprintf(newtime,"%d:%d:%d",hour,min,sec);
sprintf(sql, "insert into zc values(\"%s\", \"%d\",\"%s\", \"%s\");",newtime,1,rcv_msg.name,"添加");
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
break;
case SC://删除
bzero(sql,sizeof(sql));
sprintf(sql, "select * from dict where no = \"%s\" ;", rcv_msg.gh);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
break;
}
if(row != 1)
{
rcv_msg.type = htonl(SB);
if(send(newfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("sendto");
break;
}
break;
}
sqlite3_free_table(pres); //释放查询到的结果
bzero(sql,sizeof(sql));
sprintf(sql, "delete from dict where no = \"%s\" ;", rcv_msg.gh);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
bzero(sql,sizeof(sql));
t=time(NULL);
nowtime = localtime(&t);
hour=nowtime->tm_hour;
min=nowtime->tm_min;
sec=nowtime->tm_sec;
sprintf(newtime,"%d:%d:%d",hour,min,sec);
sprintf(sql, "insert into zc values(\"%s\", \"%d\",\"%s\", \"%s\");",newtime,1,rcv_msg.name,"删除");
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
break;
case UCX://查询
bzero(sql,sizeof(sql));
pres=NULL;
sprintf(sql, "select * from dict where uname=\"%s\";",rcv_msg.name);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
break;
}
strcpy(rcv_msg.text,"");
for(i=column; i<2*column; i++)
{
strcat(rcv_msg.text,pres[i]);
strcat(rcv_msg.text," ");
}
strcat(rcv_msg.text,"\0");
printf("%s\n",rcv_msg.text);
if(send(newfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("sendto");
break;
}
//释放查询到的结果
sqlite3_free_table(pres);
bzero(sql,sizeof(sql));
t=time(NULL);
nowtime = localtime(&t);
hour=nowtime->tm_hour;
min=nowtime->tm_min;
sec=nowtime->tm_sec;
sprintf(newtime,"%d:%d:%d",hour,min,sec);
sprintf(sql, "insert into zc values(\"%s\", \"%d\",\"%s\", \"%s\");",newtime,0,rcv_msg.name,"查询自己信息");
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
break;
case UXG://修改
bzero(sql,sizeof(sql));
sprintf(sql, "select * from dict where uname = \"%s\" ;", rcv_msg.name);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
break;
}
if(row != 1)
{
rcv_msg.type = htonl(SB);
if(send(newfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("send");
break;
}
return 0;
}
sqlite3_free_table(pres); //释放查询到的结果
bzero(sql,sizeof(sql));
sprintf(sql, "update dict set pass=\"%s\",name =\"%s\",dh=\"%s\" where uname=\"%s\";", rcv_msg.pass,rcv_msg.xm,rcv_msg.dh,rcv_msg.name);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
rcv_msg.type = htonl(CG);
if(send(newfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("send");
break;
}
bzero(sql,sizeof(sql));
t=time(NULL);
nowtime = localtime(&t);
hour=nowtime->tm_hour;
min=nowtime->tm_min;
sec=nowtime->tm_sec;
sprintf(newtime,"%d:%d:%d",hour,min,sec);
sprintf(sql, "insert into zc values(\"%s\", \"%d\",\"%s\", \"%s\");",newtime,1,rcv_msg.name,"修改自己信息");
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
break;
case LS://历史记录
bzero(sql,sizeof(sql));
pres=NULL;
sprintf(sql, "select * from zc;");
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
fprintf(stderr, "__%d__ sqlite3_get_table:%s\n", __LINE__, errmsg);
break;
}
//由于row中不包含表头的那一行,但是结果中却有表头那行
//所以,遍历的时候,需要将表头的那一行加上
strcpy(rcv_msg.text,"");
for(i=0; i<(row+1)*column; i++)
{
strcat(rcv_msg.text,pres[i]);
strcat(rcv_msg.text," ");
if((i+1)%column == 0)
{
strcat(rcv_msg.text,"\0");
printf("%s\n",rcv_msg.text);
if(send(newfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("sendto");
break;
}
strcpy(rcv_msg.text,"");
}
}
//释放查询到的结果
sqlite3_free_table(pres);
strcpy(rcv_msg.text,"OK");
if(send(newfd, &rcv_msg, sizeof(rcv_msg),0)<0)
{
ERR_LOG("sendto");
break;
}
break;
case TC://退出
bzero(sql,sizeof(sql));
sprintf(sql, "update dict set flag=\"%d\" where uname=\"%s\";", 0,rcv_msg.name);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
break;
}
break;
}
}
close(newfd);
pthread_exit(NULL);
}
int do_zc(sqlite3* db)
{
//创建一张表用户/时间\管理员\账号\操作
char sql[256]="create table if not exists zc (mtime datetime, admin char,uname char, cz char);";
char* errmsg = NULL;
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK){
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
return -1;
}
printf("表创建成功!!\n");
return 0;
}
int main(int argc, const char *argv[])
{
int sfd = socket(AF_UNIX,SOCK_STREAM,0);//创建流式套接字
if(sfd < 0)
{
ERR_MSG("socket");
return -1;
}
if(access("./unix",F_OK) == 0)//域套接字
{
if(unlink("./unix") < 0)
{
ERR_MSG("unlink");
return -1;
}
}
int reuse = 1;//允许端口快速被重用
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
struct sockaddr_un sin;//填充服务器地址信息结构体
sin.sun_family = AF_UNIX;
strcpy(sin.sun_path,"./unix");
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0 )//绑定服务器的IP地址和端口号 bind //man 7 ip
{
ERR_MSG("bind");
return -1;
}
if(listen(sfd,10) < 0)//将套接字设置为被动监听状态
{
ERR_MSG("listen");
return -1;
}
printf("服务器启动完毕!!!!\n");
if(sqlite3_open("./dict.db",&db) != SQLITE_OK)
{
printf("数据库打开失败!!\n");
printf("%s\n",sqlite3_errmsg(db));
printf("%d\n",sqlite3_errcode(db));
}
printf("成功打开sqlite3!!!\n");
//创建一张表:员工数据/工号\管理员\在线\账号\密码\姓名\年龄\电话\地址\职位\工资\评级\入职日期
char sql[256]="create table if not exists dict (no char, admin char, flag char, uname char , pass char , name char , age char , dh int , zw char ,gz int, pj char, rq date);";
char* errmsg = NULL;
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
return -1;
}
printf("表创建成功!!\n");
//创建一张表历史记录
do_zc(db);
struct sockaddr_un sep;
socklen_t addrlen =sizeof(sep);
int newfd = 0;
pthread_t tid = 0;
struct tcpx msg;
bzero(sql,sizeof(sql));
sprintf(sql, "update dict set flag=\"%d\" where flag=\"%d\";",0,1);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
{
fprintf(stderr,"__%d__ sqlite3_exec : %s\n",__LINE__,errmsg);
return -1;
}
while(1)
{
newfd = accept(sfd ,(struct sockaddr*)&sep,&addrlen);//获取新的文字描述符
if(newfd < 0)
{
ERR_MSG("accept");
return -1;
}
printf("newfd = %d 连接成功!!\n",newfd);
msg.newfd = newfd;
msg.sep = sep;
if(pthread_create(&tid,NULL,rcv_tcp,(void*)&msg) < 0)
{
ERR_MSG("pthread_create");
return -1;
}
}
//关闭套接字
close(sfd);
//关闭数据库
sqlite3_close(db);
return 0;
}