2.22-3.1员工管理系统代码

  1. 头文件: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
  1. 客户端文件: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. 服务器文件: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值