项目:电子词典

服务器

#include <head.h>

//函数头
void Storage(sqlite3* db,sqlite3* user_db);
//菜单的函数头
void mume(sqlite3* db,sqlite3* user_db);
//退出循环所用
void Drop_out(sqlite3* db,sqlite3* user_db);
//tcp网络初始化
int Link_inet();
//线程退出函数
void *Pth_drop_out(void *arg);
//线程连接后工作函数
void *Pth_tcp_work(void *arg);
//回调函数
int callback_login(void *arg, int columns, char **column_text, char **column_name);
//回调函数的展示
int callback_show(void *arg, int columns, char **column_text, char **column_name);
//查找英文注解的回调函数
int callback_find(void *arg, int columns, char **column_text, char **column_name);
//TCP的IP头和PORT
#define IP "192.168.0.226"
//#define IP "192.168.71.244"

#define PROT 5665

//打开数据库并存储字典信息
sqlite3* db;
sqlite3* user_db;
sqlite3* use_db;
//判断进行了什么错误的函数
int res_worng;
char chinese[64];
char english[32];
//判断错误
#define ERR_MSG(msg) do{\
    fprintf(stderr,"line: %d\n",__LINE__);\
    perror(msg);\
}while(0);

int main(int argc,const char * argv[])
{
    //初始化字典并等待程序响应
    printf("字典初始化中...\n");
    printf("人员管理系统启动中...\n");
    printf("请稍后\n");
    Storage(db,user_db);

    //此时创建一个线程负责服务器的关闭
    pthread_t tid;
    if((pthread_create(&tid,NULL,(void *)Pth_drop_out,NULL)) < 0)
    {
        printf("__%d__ pthread error\n",__LINE__);
        return -1;
    }
    //分离线程让内核回收
    pthread_detach(tid);
    //初始话网络连接
    printf("初始化tcp网络...\n");
    printf("请稍后\n");
    int sfd = Link_inet();

    //文件相关
    int newfd;
    struct sockaddr_in sin;
    socklen_t len = sizeof(sin);

    while(1)
    {
        newfd = accept(sfd,(struct sockaddr*)&sin,&len);
        if(newfd < 0)
        {
            ERR_MSG("accept");
            return -1;
        }
        printf("accept success\n");
        if((pthread_create(&tid,NULL,(void *)Pth_tcp_work,(void*)&newfd)) < 0)
        {
            printf("__%d__ pthread error\n",__LINE__);
            return -1;
        }
        //分离线程让内核回收
        pthread_detach(tid);
    }

    return 0;
}
//目录
void mume(sqlite3* db,sqlite3* user_db)
{   
    int a;
    while(1)
    {
        //system("clear");
        // printf("\t************************************\n");
        // printf("\t************************************\n");
        printf("\t************************************\n");
        printf("\t***************1.退出***************\n");
        printf("\t************************************\n");
        // printf("\t************************************\n");
        // printf("\t************************************\n");
        printf("请输入1退出\n");
        scanf("%d",&a);
        getchar();
        switch(a)
        {
            case 1:
            //退出词典程序删除
                Drop_out(db,user_db);
                break;
            case 2:
            //登录上词典程序
                break;
            case 3:
            //注册词典程序

                break;
            default:
                printf("输入有误请重新输入\n");
                getchar();
        }
        printf("请输入enter键清空\n");
        getchar();
    }
}
//打开数据库并存储信息
void Storage(sqlite3* db,sqlite3* user_db)
{
    //打开字典数据库和用户数据库
    if((sqlite3_open("./dict.db",&db)) != 0)
    {
        printf("sqlite3_open error %d\n",sqlite3_errcode(db));
        //return NULL;
    }
    //printf("__%d__\n",__LINE__);
    printf("sqlites_dict_open success\n");

    if((sqlite3_open("./user.db",&user_db)) != 0)
    {
        printf("sqlite3_open error %d\n",sqlite3_errcode(user_db));
        //return NULL;
    }
    if((sqlite3_open("./use.db",&use_db)) != 0)
    {
        printf("sqlite3_open error %d\n",sqlite3_errcode(use_db));
        //return NULL;
    }
    //printf("__%d__\n",__LINE__);
    printf("sqlites_user_open success\n");
    char str1[128] ="create table if not exists dict (world char,translate char);";
    char *errmsg;
    //创建数据库并存储信息
    if((sqlite3_exec(db,str1,NULL,NULL,&errmsg)) != 0)
    {
        printf(" __%d__sqlites:%d\n",__LINE__,*errmsg);
    }
    printf("open_dict success\n");

    // memset(errmsg,0,sizeof(errmsg));
    memset(str1,0,sizeof(str1));
    strcpy(str1,"create table if not exists user (user char PRIMARY KEY,password char,online int);");
    //创建数据库并存储信息
    //printf("__%d__\n",__LINE__);
    if((sqlite3_exec(user_db,str1,NULL,NULL,&errmsg)) != 0)
    {
        printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
    }
    printf("open_user success\n");

    memset(str1,0,sizeof(str1));
    strcpy(str1,"create table if not exists user_history (user char,english char,chinese char,time char);");
    //创建数据库并存储信息

    //printf("__%d__\n",__LINE__);
    if((sqlite3_exec(use_db,str1,NULL,NULL,&errmsg)) != 0)
    {
        printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
    }
    printf("open_user success\n");
    FILE* fd;
    //打开单词表
    fd = fopen("./dict.txt","r+");
    if(fd < 0)
    {
        ERR_MSG("fopen");
        //return NULL;
    }
    printf("fopen success\n");
    char buf[128] = "";
    char str[128] = "";

    int i = 0;
    //存储单词进数据库
    while(1)
    {   
        memset(str,0,sizeof(str));
        if((fgets(str,sizeof(str),fd)) ==NULL)
        {
            break;
        }
        str[strlen(str)-1]=' ';
        // printf("__%d__\n",__LINE__);
        for( i = 0; i < strlen(str);i++)
        {
            if(str[i] ==' '&&str[i+1] ==' '&&(str[i-1] >= 'a'||str[i-1] <= 'z'))
            {
                //储存进电子词典内
                *(str + i)='\0';
                sprintf(str1,"insert into dict values (\"%s\",\"%s\");",str,str+i+3);
                if((sqlite3_exec(db,str1,NULL,NULL,&errmsg)) != 0)
                {
                    printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
                }
                break;
            }
        }
    }
    memset(str1,0,sizeof(str1));
    sprintf(str1,"insert into user values (\"asd\",\"123\",0);");
    if((sqlite3_exec(user_db,str1,NULL,NULL,&errmsg)) != 0)
    {
        printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
    }
    //printf("%s\n",str1);
    printf("用户表的初始化完成\n");
    printf("字典初始化完成\n");
    fclose(fd);
}
//退出关闭所有的数据库和所有的文件
void Drop_out(sqlite3* db,sqlite3* user_db)
{
    char str1[128] = "";
    char *errmsg;
    //关闭词典数据库并删掉此数据库
    system("rm dict.db");
    printf("delet dict success");
    system("rm user.db");
    printf("delet user success");
    system("rm use.db");
    printf("delet use success");
    for(int i = 0; i < 1024; i++)
    {
        close(i);
    }
    printf("所有文件关闭成功\n");
    exit(0);
}
//TCP网络的启动
int Link_inet()
{
    //创建流式字节套
    int sfd = socket(AF_INET,SOCK_STREAM,0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }
    //允许端口快速被使用
    int reuse = 1;
    if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0){
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("允许端口快速被启用成功\n");

    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = ntohs(PROT);
    sin.sin_addr.s_addr = inet_addr(IP);
    //绑定
    if((bind(sfd,(struct sockaddr*)&sin,sizeof(sin))) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("bind success\n");
    //监听
    if((listen(sfd,128)) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("listen success\n");
    return sfd;
}
//菜单的使用
void *Pth_drop_out(void *arg)
{
    mume(db,user_db);
}
//创建线程2的使用
void *Pth_tcp_work(void *arg)
{
    //服务器和客户端的所有交流的对应的newfd
    int ress = 0,resv = 0,res = 0;
    int newfd = *(int *)arg;
    char buff[128] = "";
    char username[20]="";
    char *errmsg;
    //打开用户的数据库
    if((sqlite3_open("./user.db",&user_db)) != 0)
    {
        printf("sqlite3_open error %d\n",sqlite3_errcode(user_db));
    }
    //打开字典数据库
    if((sqlite3_open("./dict.db",&db)) != 0)
    {
        printf("sqlite3_open error %d\n",sqlite3_errcode(db));
    }
    while(1)
    {   
        //登录 L/l 注册 R/r 查询 S/s 查询历史 H/h   
        //阻塞等待接收信息
        memset(buff,0,sizeof(buff));
        resv = recv(newfd,buff,sizeof(buff),0);
        if(resv < 0)
        {
            break;
        }
        if('R' == buff[0]||'r' == buff[0])
        {
            //注册循环接收信息并发送ask包或者是error
            char str[128] = "";
            char sql[128]= "";
            int i = 0;
            //printf("__%d__\n",__LINE__);
            printf("%s\n",buff+1);
            //printf("__%d__\n",__LINE__);
            strcpy(str,buff+1);
            //printf("__%d__\n",__LINE__);
            for(i = 0; i < strlen(str);i++)//客户端需要fgets接收字符串
            {
                //确定str的字符串位置
                if( (' ' == *(str+i))&&(' ' == *(str+i+1)))
                {
                    *(str+i) = '\0';
                    //写入sql中
                    printf("%d\n",i);
                    //printf("__LINE%d__%s %s\n",__LINE__,str,str+i+2);
                    //memset(&errmsg,0,sizeof(errmsg));
                    sprintf(sql,"insert into user values (\"%s\",\"%s\",0);",str,str+i+2);
                    //printf("%s\n",sql);
                    if((sqlite3_exec(user_db,sql,NULL,NULL,&errmsg)) != 0)
                    {
                        printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
                        //printf("__%d__\n",__LINE__);
                        memset(buff,0,sizeof(buff));
                        buff[0] = 'W';
                        strcpy(buff+1,"USER IS EXIST");
                        ress = send(newfd,buff,strlen(buff),0);
                        if(ress < 0)
                        {
                            ERR_MSG("recv");
                            return NULL;
                        }
                        continue;
                        
                    }
                    else
                    {
                        memset(buff,0,sizeof(buff));
                        buff[0] = 'A';
                        strcpy(buff+1,"Successful insertion");
                        ress = send(newfd,buff,strlen(buff),0);
                        if(ress < 0)
                        {
                            ERR_MSG("recv");
                            return NULL;
                        }
                        break;
                    }

                }
            }
        }
        //登录
        else if('L' == buff[0]||'l' == buff[0])
        {
            //登录循环接收信息并发送ask包或者是error
            res_worng = -1;
            char str[128] = "";
            char sql[128]= "";
            int res = 0;
            int i = 0;
            //printf("__%d__\n",__LINE__);
            //printf("%s\n",buff+1);
            //printf("__%d__\n",__LINE__);
            strcpy(str,buff+1);
            //在
            //printf("__%d__\n",__LINE__);
            for(i = 0; i < strlen(str);i++)//客户端需要fgets接收字符串
            {
                //确定str的字符串位置
                if( (' ' == *(str+i))&&(' ' == *(str+i+1)))
                {
                    *(str+i) = '\0';
                    //写入sql中
                    //printf("%d\n",i);
                    //printf("__LINE%d__%s %s\n",__LINE__,str,str+i+2);
                    //找数据库是否有这个人的信息
                    //筛选信息名字是这个人
                    sprintf(sql,"SELECT * FROM user WHERE(user =\"%s\");",str);
                    //printf("%s\n",sql);
                    memset(username,0,sizeof(username));
                    strcpy(username,str);
                    //printf("%d%d\n",__LINE__,res_worng);
                    if((res = (sqlite3_exec(user_db,sql,callback_login,(void*)str+i+2,&errmsg))) != 0)
                    {
                        // printf("__%d__\n %d",__LINE__,res);
                        // //判断收到的信号是几如果是-1就是密码错误
                        printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
                    }
                    //判断传入的信息
                    //printf("%d %d",__LINE__,res_worng);
                    if(res_worng == -1)
                    {
                        printf("__%d__\n",__LINE__);
                        memset(buff,0,sizeof(buff));
                        buff[0] = 'W';
                        strcpy(buff+1,"USER IS NOEXIST");
                        ress = send(newfd,buff,strlen(buff),0);
                        if(ress < 0)
                        {
                            ERR_MSG("recv");
                            return NULL;
                        }
                        continue; 
                    }
                    else if(res_worng == -3)
                    {
                        printf("__%d__\n",__LINE__);
                        memset(buff,0,sizeof(buff));
                        buff[0] = 'W';
                        strcpy(buff+1,"USER WRONG PASSWORD");
                        ress = send(newfd,buff,strlen(buff),0);
                        if(ress < 0)
                        {
                            ERR_MSG("recv");
                            return NULL;
                        }
                        continue;  
                    }
                    else if(res_worng == -2)
                    {
                        memset(buff,0,sizeof(buff));
                        buff[0] = 'W';
                        strcpy(buff+1,"USER IS ONLINE");
                        ress = send(newfd,buff,strlen(buff),0);
                        if(ress < 0)
                        {
                            ERR_MSG("recv");
                            return NULL;
                        }
                        break;
                    }
                    else if(res_worng == 0)
                    {
                        memset(buff,0,sizeof(buff));
                        buff[0] = 'A';
                        strcpy(buff+1,"Successful insertion");
                        ress = send(newfd,buff,strlen(buff),0);
                        if(ress < 0)
                        {
                            ERR_MSG("recv");
                            return NULL;
                        }
                        //登陆成功此时把此人信息上的0置为1
                        memset(sql,0,sizeof(sql));
                        sprintf(sql,"UPDATE user SET online=1  WHERE(user =\"%s\");",str);
                        //printf("%s\n",sql);
                        //UPDATE stu SET score=60 WHERE id=1;
                        if((sqlite3_exec(user_db,sql,NULL,NULL,&errmsg)) != 0)
                        {
                            printf("sqlite3_exec error __%d__",__LINE__);
                        }
                        //printf("__%d__\n",__LINE__);
                        break;
                    }

                }
            }
        }
        else if('S' == buff[0]||'s' == buff[0])
        {
            //查找
            char str[128] = "";
            char sql[128]= "";
            char time_time[32]="";
            int res = 0;
            int i = 0;
            struct tm* info;
            char** pres = NULL;
            int row, column;
            //printf("__%d__\n",__LINE__);
            //printf("%s\n",buff+1);
            memset(chinese,0,sizeof(chinese));
            memset(english,0,sizeof(english));
            strcpy(str,buff+1);
            sprintf(sql,"SELECT * FROM dict WHERE(world =\"%s\");",str);
            //printf("%s\n",sql);
            if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
            {
                printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
            }
            if(row < 1)
            {
                //printf("__%d__\n %d",__LINE__,row);
                // //判断收到的信号是几如果是-1就是密码错误
                //printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
                //如果错误就是没有找到英文有误或者不存在
                //printf("__%d__\n",__LINE__);
                memset(buff,0,sizeof(buff));
                buff[0] = 'W';
                strcpy(buff+1,"ENGLISH IS NOEXIST");
                ress = send(newfd,buff,strlen(buff),0);
                if(ress < 0)
                {
                    ERR_MSG("recv");
                    return NULL;
                }
                continue;
            }
            else
            {   //清空再先给所有的0位置为'a'
                memset(buff,0,sizeof(buff));
                buff[0] = 'A';
                if(row == 1)
                {
                    strcpy(buff+1,pres[3]);
                    printf("%d %s\n",__LINE__,buff);
                    ress = send(newfd,buff,strlen(buff),0);
                    if(ress < 0)
                    {
                        ERR_MSG("recv");
                        return NULL;
                    }
                    memset(sql,0,sizeof(sql));
                    memset(time_time,0,sizeof(time_time));
                    strcpy(english,pres[2]);
                    strcpy(chinese,pres[3]);
                    time_t t = time(NULL);
                    info = localtime(&t);
                    sprintf(time_time,"%d/%d %d:%d:%d",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min,info->tm_sec);
                    sprintf(sql,"insert into user_history values (\"%s\",\"%s\",\"%s\",\"%s\");",username,english,chinese,time_time);
                    //printf("%s\n",sql);
                    if((sqlite3_exec(use_db,sql,NULL,NULL,&errmsg)) != 0)
                    {
                        printf("sqlite3_exec error __%d__",__LINE__);
                    }
                }
                else if(row == 2)
                {
                    printf("%d",__LINE__);
                    for(int i=0;i < row;i++)
                    {
                        if(i == 0)
                        {
                            //将翻译位置上给他
                            strcpy(buff+1,pres[3]);
                        }
                        else
                        {
                            strcat((buff+strlen(pres[3])+3),pres[5]);
                        }
                    }
                    printf("__%d__%s,%s\n",__LINE__,buff+1,buff+3+strlen(pres[3]));
                    ress = send(newfd,buff,strlen(pres[3])+strlen(pres[5])+3,0);
                    if(ress < 0)
                    {
                        ERR_MSG("recv");
                        return NULL;
                    }
                    memset(chinese,0,sizeof(chinese));
                    memset(english,0,sizeof(english));
                    strcpy(english,pres[2]);
                    strcpy(chinese,pres[3]);
                    memset(sql,0,sizeof(sql));
                    memset(time_time,0,sizeof(time_time));
                    time_t t = time(NULL);
                    info = localtime(&t);
                    sprintf(time_time,"%d/%d %d:%d:%d",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min,info->tm_sec);
                    sprintf(sql,"insert into user_history values (\"%s\",\"%s\",\"%s\",\"%s\");",username,english,chinese,time_time);
                    //printf("%s\n",sql);
                    if((sqlite3_exec(use_db,sql,NULL,NULL,&errmsg)) != 0)
                    {
                        printf("sqlite3_exec error __%d__",__LINE__);
                    }
                    //第二个意义
                    memset(chinese,0,sizeof(chinese));
                    strcpy(chinese,pres[5]);
                    memset(sql,0,sizeof(sql));
                    memset(time_time,0,sizeof(time_time));
                    info = localtime(&t);
                    sprintf(time_time,"%d/%d %d:%d:%d",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min,info->tm_sec);
                    sprintf(sql,"insert into user_history values (\"%s\",\"%s\",\"%s\",\"%s\");",username,english,chinese,time_time);
                    //printf("%s\n",sql);
                    if((sqlite3_exec(use_db,sql,NULL,NULL,&errmsg)) != 0)
                    {
                        printf("sqlite3_exec error __%d__",__LINE__);
                    }
                    sqlite3_free_table(pres);
                    pres = NULL;
                }
            }
        }   
        else if('B' == buff[0]||'b' == buff[0])
        {
                        //登录循环接收信息并发送ask包或者是error
            char str[128] = "";
            char sql[128]= "";
            int res = 0;
            int i = 0;
            //printf("__%d__\n",__LINE__);
            printf("%s\n",buff+1);
            //printf("__%d__\n",__LINE__);
            strcpy(str,buff+1);
            //在
            //printf("__%d__\n",__LINE__);

            *(str+i) = '\0';

            sprintf(str,"UPDATE user SET online=0  WHERE(user =\"%s\");",username);
            //printf("%s\n",str1);
            //UPDATE stu SET score=60 WHERE id=1;
            if( (sqlite3_exec(user_db,str,NULL,NULL,&errmsg)) != 0)
            {
                printf("sqlite3_exec error __%d__",__LINE__);
            }
            buff[0] = 'A';
            strcpy(buff+1,"RETURN Successful");
            ress = send(newfd,buff,strlen(buff),0);
            if(ress < 0)
            {
                ERR_MSG("recv");
                return NULL;
            }
        }
    }

}
//回调函数
int callback_login(void *arg, int columns, char **column_text, char **column_name)
{
    char *str = (char *)arg;
    //printf("__%d__str =%s\n",__LINE__,str);
    //for(int i = 0; i < 3;i++)
    //printf("__%d__%s\n",__LINE__,*(column_text+i));
    
    //res_worng先初始化
    // res_worng = 0;
    //  printf("colums = %d",columns);
    //  printf("%d %s\n",__LINE__,*(column_text + 1));
    //先判断是否有信息
    // if(columns < 1)
    // {
    //     //如果最开始用户名是空就可以直接返回用户不存在信息
    //     //printf("__%d__\n",__LINE__);
    //     res_worng = -1;
    //     return -1;
    // }
    //到这相当于于是有这个用户名的
    //printf("%d %d\n",__LINE__,strcmp(str,*(column_text + 1)));
    if(strcmp(str,*(column_text + 1)) == 0)
    {
        //printf("__%d__\n",__LINE__);
        //有这个角色
        //0的话就看登录条件是不是0如果是0就就
        if(strcmp("0",*(column_text + 2)) == 0)
        {
            //printf("__%d__\n",__LINE__);
            res_worng = 0;
            return 0;
        }
        else
        {
            //-3 是已经登录,重复登录过程
            res_worng = -2;
            return 0;
        }
    }
    else
    {
        //密码错误
        res_worng = -3;
        return 0;
    }
    
}
//判断是否有这个英文或者是否存在
int callback_find(void *arg, int columns, char **column_text, char **column_name)
{
    int size_chinese = 0;
    memset(chinese,0,sizeof(chinese));
    memset(english,0,sizeof(english));
    //把中文翻译放进Chinese字符串中
    strcpy(english,*(column_text));
    strcpy(chinese,*(column_text+1));
    //printf("%d__\n",__LINE__);
    return 0;
}

客户端

#include <head.h>
//登录前的菜单
void before_login_mume();
//登录后的菜单
void after_login_mume(char* str);
//客户端的建立和服务器的连接
int Link_inet();
//登录
int Login();
//注册
int Registered();
//查找
void *Pth_work(void* arg);
//查找单词
int Find();
//查看历史
int search_history(char* name);
//退出登录
int Retu_break();
//TCP的IP头和PORT
//#define IP "192.168.8.220"
#define IP "192.168.0.226"
//#define IP "192.168.71.244"
#define PROT 5665

//判断错误
#define ERR_MSG(msg) do{\
fprintf(stderr,"line: %d\n",__LINE__);\
perror(msg);\
}while(0);

int newfd;
int sfd;
char english[32];

sqlite3* db;
sqlite3* user_db;
sqlite3* use_db;
int main(int argc,const char * argv[])
{
    //建立tcp的
    int newfd = Link_inet();
    //分线程让线程解决和服务器交互
    pthread_t tid;
    if((pthread_create(&tid,NULL,(void*)Pth_work,NULL)) < 0)
    {
        printf("pthread_error __%d__\n",__LINE__);
    }

    pthread_join(tid,NULL);

    return 0;
}
//菜单
void before_login_mume()
{
    int a;
    while(1)
    {
        system("clear");
        printf("\t************************************\n");
        printf("\t************************************\n");
        printf("\t***************1.注册***************\n");
        printf("\t***************2.登录***************\n");
        printf("\t***************0.退出***************\n");
        printf("\t************************************\n");
        printf("\t************************************\n"); 
        printf("\tENTER YOUR CHOOSE\n");
        scanf("%d",&a);
        getchar();
        switch(a)
        {
            case 0:
            exit(0);    
                break;
            case 2:
            //进行一个登录的函数
            //判断返回值是否登录成功如果成功就进入下一个循环作业界面
            Login();
                break;
            case 1:
            Registered();
                break;
            default:
                printf("CHOOSE ERROR\n");
                continue;
        } 
        getchar();
        printf("PLEASE INPUT ENTER");
        getchar();  
    }
}
void after_login_mume(char* str)
{
    //打开数据库
    if((sqlite3_open("./user.db",&user_db)) != 0)
    {
        printf("sqlite3_open error %d\n",sqlite3_errcode(user_db));
    }
    char str1[128] = "";
    char *errmsg;
    int a;
    while(1)
    {
        system("clear");
        printf("\t**********欢迎%s使用*****\n",str);
        printf("\t************************************\n");
        printf("\t************************************\n");
        printf("\t***************1.退出***************\n");
        printf("\t***************2.查找***************\n");
        printf("\t***************3.历史***************\n");
        printf("\t************************************\n");
        printf("\t************************************\n");\
        printf("\tENTER YOUR CHOOSE\n");
        scanf("%d",&a);
        getchar();
        switch(a)
        {
            case 1:
            // //并修改数据库置为0
            // memset(str1,0,sizeof(str1));
            // sprintf(str1,"UPDATE user SET online=0  WHERE(user =\"%s\");",str);
            // //printf("%s\n",str1);
            // //UPDATE stu SET score=60 WHERE id=1;
            // if( (sqlite3_exec(user_db,str1,NULL,NULL,&errmsg)) != 0)
            // {
            //     printf("sqlite3_exec error __%d__",__LINE__);
            // }
            Retu_break();
                break;
            case 2:
                Find();
                getchar();
                break;
            case 3:
                search_history(str);
                break;
            default:
                printf("CHOOSE ERROR\n");
                continue;
        } 
        if(a == 1)
        {
            //system("clear");
            break;
        } 
        printf("PLEASE INPUT ENTER\n");
        getchar();
    }
}
//TCP建立连接的过程
int Link_inet()
{
    //创建流式字节套
    sfd = socket(AF_INET,SOCK_STREAM,0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PROT);
    sin.sin_addr.s_addr = inet_addr(IP);
    //和服务器连接
    int newfd = connect(sfd,(struct sockaddr*)&sin,sizeof(sin));
    if(newfd < 0)
    {
        ERR_MSG("connect");
        return -1;
    }
    printf("connect success\n");
    return sfd;
}
void *Pth_work(void* arg)
{
    //int newfd = *(int*)arg;
    int a;
    //菜单栏的改变
    before_login_mume();

    pthread_exit(NULL);
}
//登录
int Login()
{
    //登录 L/l 注册 R/r 查询 S/s 查询历史 H/h 
    int ress = 0,resv = 0;
    char buff[128]="";
    char str[20]="";
    int a = 0;
    char name[20] ="";
    while(1)
    {
        memset(buff,0,sizeof(buff));
        memset(str,0,sizeof(str));
        buff[0] = 'L';
        printf("请输入你的用户名\n");
        scanf("%s",str);
        //储存用户名
        memset(name,0,sizeof(name));
        strcat(buff+1,str);
        strcat(name,str);
        a = strlen(str);
        printf("请输入你的密码\n");
        memset(str,0,sizeof(str));
        scanf("%s",str);
        //储存密码
        strcat(buff+1+a+2,str);
        buff[a+1] =' ';
        buff[a+2] =' ';
        //发送信息给服务器登录信息并判断是否发送成功
        ress = send(sfd,buff,strlen(buff),0);
        if(ress < 0)
        {
            ERR_MSG("send");
            return -1;
        }
        //接收信息
        //printf("__%d__\n",__LINE__);
        memset(buff,0,sizeof(buff));
        resv = recv(sfd,buff,sizeof(buff),0);
        //printf("%s\n",buff);
        if(resv < 0)
        {
            ERR_MSG("recv");
            return -1;
        }
        if('W' == buff[0]&&0 == strcmp(buff+1,"USER IS NOEXIST"))
        {
            //输入有误
            printf("用户不存在,请先注册\n");
            break;
        }
        else if('W' == buff[0]&&0 == strcmp(buff+1,"USER WRONG PASSWORD"))
        {
            printf("用户密码错误,请重新输入\n");
            continue;
        }
        else if('W' == buff[0]&&0 == strcmp(buff+1,"USER IS ONLINE"))
        {
            printf("请不要重复登录,请重新输入\n");
            break;
        }
        else if('A' == buff[0])
        {
            printf("登录成功\n");
            after_login_mume(name);
            break;
        }
    }

}
//注册
int Registered()
{
  //登录 L/l 注册 R/r 查询 S/s 查询历史 H/h 
    int ress = 0,resv = 0;
    char buff[128]="";
    char str[20]="";
    int a = 0;

    while(1)
    {
        memset(buff,0,sizeof(buff));
        buff[0] = 'R';
        memset(str,0,sizeof(str));
        printf("请输入你注册的用户名\n");
        scanf("%s",str);
        //储存用户名
        strcat(buff+1,str);
        a = strlen(str);
        memset(str,0,sizeof(str));
        printf("请输入你的密码\n");
        scanf("%s",str);
        //储存密码
        strcat(buff+1+a+2,str);
        buff[a+1] =' ';
        buff[a+2] =' ';
        //发送信息给服务器注册信息并判断是否发送成功
        ress = send(sfd,buff,strlen(buff),0);
        if(ress < 0)
        {
            ERR_MSG("send");
            return -1;
        }
        //接收信息
        //printf("__%d__\n",__LINE__);
        memset(buff,0,sizeof(buff));
        resv = recv(sfd,buff,sizeof(buff),0);
        //printf("%s\n",buff);
        if(resv < 0)
        {
            ERR_MSG("recv");
            return -1;
        }
        if('W' == buff[0]&&0 == strcmp(buff+1,"USER IS EXIST"))
        {
            //输入有误
            printf("用户已经存在,请不要重新注册\n");
            break;
        }
        else if('A' == buff[0])
        {
            printf("注册成功\n");
            break;
        }
        return 0;
        //printf("__%d__\n",__LINE__);
    }
}
//查找
int Find()
{
    //登录 L/l 注册 R/r 查询 S/s 查询历史 H/h 
    int ress = 0,resv = 0;
    char buff[128]="";
    char str[20]="";
    int a = 0;
    char name[20] ="";
    while(1)
    {
        memset(buff,0,sizeof(buff));
        memset(str,0,sizeof(str));
        memset(english,0,sizeof(english));
        buff[0] = 'S';
        printf("请输入需要查找的英文\n");
        scanf("%s",str);
        strcpy(english,str);
        //储存英文
        strcat(buff+1,str);
        //发送信息给服务器登录信息并判断是否发送成功
        ress = send(sfd,buff,strlen(buff),0);
        if(ress < 0)
        {
            ERR_MSG("send");
            return -1;
        }
        //接收信息
        //printf("__%d__\n",__LINE__);
        memset(buff,0,sizeof(buff));
        resv = recv(sfd,buff,sizeof(buff),0);
        //printf("%s\n",buff);
        if(resv < 0)
        {
            ERR_MSG("recv");
            return -1;
        }
        if('W' == buff[0]&&0 == strcmp(buff+1,"ENGLISH IS NOEXIST"))
        {
            //输入有误
            printf("此英文不存在,请重新输入\n");
            continue;;
        }
        else if('A' == buff[0])
        {
            int i =0;
            // for( i=1;i < resv;i++)
            // {
            //     printf("%d  %c",i,buff[i]);
            // }
            // printf("\n");
            printf("English\t Chinese\n");
            //printf("%d\n",resv);
            for( i=1;i < resv;i++)
            {
                if(buff[i+1] =='n'&&buff[i+2]=='.')
                {
                    printf("%s\t %s\n",english,buff+1+i);
                }
            }
            if(i >= resv)
            {
                printf("%s\t %s\n",english,buff+1);
            }
            break;
        }
    }

}
//查看历史
int search_history(char* name)
{
    //打开数据库
    if((sqlite3_open("./use.db",&use_db)) != 0)
    {
        printf("sqlite3_open error %d\n",sqlite3_errcode(user_db));
    }
    //登录 L/l 注册 R/r 查询 S/s 查询历史 H/h 
    char sql[128]= "";
    char time_time[32]="";
    int res = 0;
    int i = 0;
    struct tm* info;
    char** pres = NULL;
    int row, column;
    int ress = 0,resv = 0;
    char buff[128]="";
    char str[20]="";
    int a = 0;
    char *errmsg;
    //收到H信号就需要打开use.db
    sprintf(sql,"SELECT * FROM user_history WHERE(user =\"%s\");",name);
    //printf("%s\n",sql);
    if(sqlite3_get_table(use_db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
    {
        printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
    }
    if(row < 1)
    {
        printf("无记录,请先查找单词\n");
    }
    else
    //大于三天条只取最后2条
    {
        // for(int i=0; i<(row+1)*column; i++)
        // {
        //     printf("%d %s\n",i,pres[i]);
        // }
        for(int i=0; i<(row+1)*column; i++)
        {
            printf("%s\t", pres[i]);
            // if(i%column == column-2)
            //     printf("\t");
            if(i%column == column-1)
                putchar(10);
        }
        //释放空间
        sqlite3_free_table(pres);
        pres = NULL;
    }
    return 0;
}

//退出
int Retu_break()
{
    //登录 L/l 注册 R/r 查询 S/s 查询历史 H/h 退出B/b
    int ress = 0,resv = 0;
    char buff[128]="";
    char str[20]="";
    int a = 0;
    char name[20] ="";
    while(1)
    {
        memset(buff,0,sizeof(buff));
        memset(str,0,sizeof(str));
        buff[0] = 'B';
        //发送信息给服务器登录信息并判断是否发送成功
        ress = send(sfd,buff,strlen(buff),0);
        if(ress < 0)
        {
            ERR_MSG("send");
            return -1;
        }
        //接收信息
        memset(buff,0,sizeof(buff));
        resv = recv(sfd,buff,sizeof(buff),0);
        if(resv < 0)
        {
            ERR_MSG("recv");
            return -1;
        }
        if('A' == buff[0])
        {
            int i =0;
            printf("退出成功\n");
            break;
        }
    }
}

用户不存在时

 重复登录

 查单词

 

 

 查看历史

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值