带电子词典的学生信息管理系统

前言:

既然我们已经写完了电子词典,那不妨将学生信息管理和电子词典合并一下

manager_student_server3.c

#include 
#include
#include
#include
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#include

//基于TCP通信,使用数据库完成学生信息管理系统,并增加电子词典功能
//服务端
int socket_ok = -1;
char sql[512];//存储服务端发来的sql


//查找操作
void select_info(sqlite3* mydb){

    //操作数据库,执行特定的sql语句
    //定义sql语句,查询
    char sql2[128] = "select * from student;";
    //操作数据库
    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    int n=0;
    sqlite3_get_table(mydb,sql2,&resultp,&row,&column,NULL);

    char resultStr[4096] = "";//存储结果集

    memset(resultStr,0,sizeof(resultStr));
    //拼接字符串
    for(int i=0;i<(row+1)*column;i++)//(row+1)这里加1,是因为没有把头算进去,我们要想输出头,就需要+1
    {
        
        strcat(resultStr, resultp[i]);//拼接字符串
        strcat(resultStr, "\t\t"); // 使用制表符分隔

        if((i+1)%column == 0)//这里是换行,每当下标i取模列为0的时候换行
        {
            strcat(resultStr, "\n");//换行
        }
    }

    //发送数据
    send(socket_ok,resultStr,sizeof(resultStr),0);
}


//增加操作
void add(sqlite3* mydb){

    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;

    recv(socket_ok,sql,sizeof(sql),0);//阻塞等待,这里等客户端发来sql语句
    //执行sql
    sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);
    

    char buf[12] = "1";
    //发送数据
    send(socket_ok,buf,sizeof(buf),0);

    memset(sql,0,sizeof(sql));

}


//删除操作
void delete_info(sqlite3* mydb){

    //接收客户端发来的名字
    char name[12];
    memset(name,0,sizeof(name));
    recv(socket_ok,name,sizeof(name),0);
    
    //判断名字是否合法
    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    char sql1[256] = "select name from student;";
    sqlite3_get_table(mydb,sql1,&resultp,&row,&column,NULL);

    for(int i=1;i<(row+1)*column;i++){
        if(strcmp(name,resultp[i])==0){

            //到这里名字合法,可以执行删除操作
            //拼接sql语句
            snprintf(sql,sizeof(sql),"delete from student where name = '%s';",name);

            sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);

            //发送结果
            char msg2[128] = "0";
            send(socket_ok,msg2,sizeof(msg2),0);

            memset(sql,0,sizeof(sql));
            return;

        }
    }

    //程序走到这就说明,要删除的学生不存在
    //发送结果
    char msg[128] = "-1";
    send(socket_ok,msg,strlen(msg),0);

}

//修改操作
void update(sqlite3* mydb){
    //接收客户端发来的名字
    char name[12];
    memset(name,0,sizeof(name));
    recv(socket_ok,name,sizeof(name),0);
    
    //判断名字是否合法
    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    char sql1[256] = "select name from student;";
    sqlite3_get_table(mydb,sql1,&resultp,&row,&column,NULL);

    //遍历判断名字是否合法
    for(int i=1;i<(row+1)*column;i++){

        if(strcmp(name,resultp[i])==0){
            
            //到这里名字合法,可以执行修改操作
            //发送结果
            char msg1[128] = "1";
            send(socket_ok,msg1,sizeof(msg1),0);

            //接收sql
            recv(socket_ok,sql,sizeof(sql),0);//阻塞等待,这里等客户端发来sql语句
            sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);

            //发送结果
            char msg2[128] = "0";
            send(socket_ok,msg2,sizeof(msg2),0);

            memset(sql,0,sizeof(sql));
            return;

        }
    }
    
    //程序走到这就说明,要修改的学生不存在
    //发送结果
    char msg[128] = "-1";
    send(socket_ok,msg,sizeof(msg),0);
}

//计算平均分
void avg(sqlite3* mydb){

    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;

    //拼接字符串
    char sql1[256]= "select score from student;";
    sqlite3_get_table(mydb,sql1,&resultp,&row,&column,NULL);
    int sum = 0;
    int num = 0;
    for(int i=1;i<(row+1)*column;i++){
        sum += atoi(resultp[i]);
        num++;
    }
    float avg_sum = sum/(float)num;
    
    char msg[12];
    snprintf(msg,sizeof(msg),"%lf",avg_sum);

    //发送数据
    send(socket_ok,msg,sizeof(msg),0);
}


//查找一个学生信息
void select_one(sqlite3* mydb){
    //接收客户端发来的名字
    char name[12];
    memset(name,0,sizeof(name));
    recv(socket_ok,name,sizeof(name),0);
    

    //操作数据库,执行特定的sql语句
    char** resultp;
    int row; 
    int column;
    snprintf(sql,sizeof(sql),"select * from student where name = '%s';",name);
    printf("%s\n",sql);
    sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);
    
    char resultStr[4096] = "";//存储结果集
    memset(resultStr,0,sizeof(resultStr));
    //拼接字符串
    for(int i=0;i<(row+1)*column;i++)//(row+1)这里加1,是因为没有把头算进去,我们要想输出头,就需要+1
    {
        
        strcat(resultStr, resultp[i]);//拼接字符串
        strcat(resultStr, "\t\t"); // 使用制表符分隔

        if((i+1)%column == 0)//这里是换行,每当下标i取模列为0的时候换行
        {
            strcat(resultStr, "\n");//换行
        }
    }

    //发送数据
    send(socket_ok,resultStr,sizeof(resultStr),0);
    memset(sql,0,sizeof(sql));
}

//查询学生老师信息
void sel_stu_tea(sqlite3* mydb){
    //接收客户端发来的名字
    char name[12];
    memset(name,0,sizeof(name));
    recv(socket_ok,name,sizeof(name),0);

    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;

    //拼接sql语句
    snprintf(sql,sizeof(sql),"select student.*,teacher.name from student,teacher where teacher.teacher_stu = student.name and student.name = '%s';",name);

    sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);

    char resultStr[4096] = "";//存储结果集
    memset(resultStr,0,sizeof(resultStr));
    //拼接字符串
    for(int i=0;i<(row+1)*column;i++)//(row+1)这里加1,是因为没有把头算进去,我们要想输出头,就需要+1
    {
        
        strcat(resultStr, resultp[i]);//拼接字符串
        strcat(resultStr, "\t\t"); // 使用制表符分隔

        if((i+1)%column == 0)//这里是换行,每当下标i取模列为0的时候换行
        {
            strcat(resultStr, "\n");//换行
        }
    }

    //发送数据
    send(socket_ok,resultStr,sizeof(resultStr),0);
    memset(sql,0,sizeof(sql));

}


//给学生添加一个老师
void add_tea(sqlite3* mydb){

    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;

    recv(socket_ok,sql,sizeof(sql),0);//阻塞等待,这里等客户端发来sql语句
    //执行sql
    sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);
    

    char buf[12] = "1";
    //发送数据
    send(socket_ok,buf,sizeof(buf),0);

    memset(sql,0,sizeof(sql));

}

//查找所有老师信息
void select_tea(sqlite3* mydb){

    //定义sql语句,查询
    char sql2[128] = "select * from teacher;";
    //操作数据库
    char** resultp; 
    int row; 
    int column;
    int n=0;
    sqlite3_get_table(mydb,sql2,&resultp,&row,&column,NULL);

    char resultStr[4096] = "";//存储结果集
    memset(resultStr,0,sizeof(resultStr));
    //拼接字符串
    for(int i=0;i<(row+1)*column;i++)//(row+1)这里加1,是因为没有把头算进去,我们要想输出头,就需要+1
    {
        
        strcat(resultStr, resultp[i]);//拼接字符串
        strcat(resultStr, "\t\t"); // 使用制表符分隔

        if((i+1)%column == 0)//这里是换行,每当下标i取模列为0的时候换行
        {
            strcat(resultStr, "\n");//换行
        }
    }

    //发送数据
    send(socket_ok,resultStr,sizeof(resultStr),0);

}

//登录管理
void login(sqlite3* mydb){

    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;

    //接收账号
    char id[12];
    memset(id,0,sizeof(id));
    recv(socket_ok,id,sizeof(id),0);

    //接收账号
    char password[12];
    memset(password,0,sizeof(password));
    recv(socket_ok,password,sizeof(password),0);


    snprintf(sql,sizeof(sql),"select * from user where id = '%s' and password = '%s'",id,password);
    //执行sql
    sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);


    char resultStr[4096] = "";//存储结果集
    memset(resultStr,0,sizeof(resultStr));
    //拼接字符串
    for(int i=0;i<(row+1)*column;i++)//(row+1)这里加1,是因为没有把头算进去,我们要想输出头,就需要+1
    {
        
        strcat(resultStr, resultp[i]);//拼接字符串
        strcat(resultStr, "\t\t"); // 使用制表符分隔

        if((i+1)%column == 0)//这里是换行,每当下标i取模列为0的时候换行
        {
            strcat(resultStr, "\n");//换行
        }
    }
    //发送数据
    send(socket_ok,resultStr,sizeof(resultStr),0);
    
    memset(sql,0,sizeof(sql));

}

//注册管理
void user_register(sqlite3* mydb){

    char** resultp;
    int row; 
    int column;

    //接收账号
    char id[12];
    memset(id,0,sizeof(id));
    recv(socket_ok,id,sizeof(id),0);

    //接收账号
    char password[12];
    memset(password,0,sizeof(password));
    recv(socket_ok,password,sizeof(password),0);

    //首先检查账号合不合法
    char sql2[128] = "select * from user;";
    sqlite3_get_table(mydb,sql2,&resultp,&row,&column,NULL);

    for(int i=0;i<(row+1)*column;i++){

        if(strcmp(id,resultp[i])==0){//账号重复,非法
            char msg[12] = "-1";
            send(socket_ok,msg,strlen(msg),0);
            return;
        }
    }

    //到这里账号合法
    snprintf(sql,sizeof(sql),"insert into user(id,password)values('%s','%s')",id,password);
    //执行sql
    sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);
    char msg2[12] = "1";
    send(socket_ok,msg2,strlen(msg2),0);
    memset(sql,0,sizeof(sql));

}

//记录查询单词记录
void history(sqlite3* mydb,char str1[],char str2[]){

    char** resultp;
    int row; 
    int column;

    //拼接sql
    memset(sql,0,sizeof(sql));
    snprintf(sql,sizeof(sql),"insert into dict_history(word,explain)values('%s','%s');",str1,str2);
    sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);

    memset(sql,0,sizeof(sql));
}

//字典功能
void dict(sqlite3* mydb){

    //首先读出字典的数据
    //使用标准io打开字典文件
    FILE* fp = fopen("./dict.txt","r");
    if(fp==NULL){
        perror("open dict.txt failed");
        return;
    }

    //接收查询的单词
    char msg[30];
    memset(msg,0,sizeof(msg));
    recv(socket_ok,msg,sizeof(msg),0);
    printf("查询%s\n",msg);

    
    char buf[1024];//存储一行数据
    memset(buf,0,sizeof(buf));
    char msg2[1024];//存储单词解释

    //feof 函数用于检查文件流的文件结束标志。如果 feof(fp) 返回 0(假),
    //表示文件流 fp 还没有到达文件的末尾,如果返回非零值(真),表示文件流 fp 已经到达文件的末尾。
    while(fgets(buf,sizeof(buf),fp)!=NULL && !feof(fp)){//确保读到了文件尾

        //这里为了避免记录单词查询记录时出错,我们把buf最后的回车符去掉
        size_t ret = strcspn(buf,"\n");// 使用strcspn函数找到回车符的位置
        // 如果找到回车符,则将其替换为字符串结束符'\0'
        if (buf[ret] == '\n') {
            buf[ret] = '\0';
        }
        
        char dest[25];//存储读出来的单词
        memset(dest,0,sizeof(dest));//清0
        //sscanf 函数在提取数据时是以空白字符(例如空格、制表符、换行符等)作为分隔符的。当你使用 "%s" 格式指定来提取一个字符串时
        //,sscanf 会从输入字符串 input 中找到第一个非空白字符,然后开始提取字符,直到再次遇到空白字符为止。
        sscanf(buf,"%s",dest);//观察字典文件可知,只需要拷贝前17个字节中的单词部分

        if( strcmp(msg,dest) == 0 ){//匹配查询的单词
            memset(msg2,0,sizeof(msg2));
            strcpy(msg2,&buf[17]);//从第18个字节开始一直到最后,就是单词的解释
            send(socket_ok,msg2,strlen(msg2),0);

            history(mydb,msg,msg2);//查询到记录查询

            return;
        }

        memset(buf,0,sizeof(buf));

    }


    //程序到这里说明没有找到单词
    char msg3[64] = "-1";
    send(socket_ok,msg3,strlen(msg3),0);
    fclose(fp);
}

//查看单词查询记录
void dict_history(sqlite3* mydb){

    //操作数据库,执行特定的sql语句
    char sql2[128] = "select * from dict_history;";
    //操作数据库
    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    sqlite3_get_table(mydb,sql2,&resultp,&row,&column,NULL);

    char resultStr[4096] = "";//存储结果集
    memset(resultStr,0,sizeof(resultStr));
    //拼接字符串
    for(int i=0;i<(row+1)*column;i++)//(row+1)这里加1,是因为没有把头算进去,我们要想输出头,就需要+1
    {
        
        strcat(resultStr, resultp[i]);//拼接字符串
        strcat(resultStr, "\t\t"); // 使用制表符分隔

        if((i+1)%column == 0)//这里是换行,每当下标i取模列为0的时候换行
        {
            strcat(resultStr, "\n");//换行
        }
    }

    //发送数据
    send(socket_ok,resultStr,sizeof(resultStr),0);
}

int main(int argc,char** argv)
{

    //打开数据库
    sqlite3* mydb = NULL; 
    int ret = sqlite3_open("./stu.db",&mydb);
    if(ret==-1){
        perror("open failed");
        return -1;
    }

    //1. 创建套接字
    int socket_fd = socket(AF_INET,SOCK_STREAM,0);
    if(socket_fd == -1){
        printf("创建套接字失败\n");
        return -1;
    }

    //2. 绑定套接字与服务端网络地址
    struct sockaddr_in s_addr;
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(atoi(argv[2]));
    s_addr.sin_addr.s_addr = inet_addr(argv[1]);
    //绑定
    int bind_ok = bind(socket_fd,(struct sockaddr*)&s_addr,sizeof(s_addr));
    if(bind_ok==-1){
        perror("bind failed");
    }

    //3. 设置监听
    int socket_listen = listen(socket_fd,4);

    //4.等待对端连接
    printf("等待连接\n");
    struct sockaddr_in c_addr;//保存客户端地址信息
    socklen_t size_len = sizeof(c_addr);
    socket_ok = accept(socket_fd,(struct sockaddr*)&c_addr,&size_len);
    if(socket_ok==-1){
        perror("连接失败\n");
        return -1;
    }
    printf("连接成功\n");

    char buf[128];
    while(1){

        //5.接收客户端发来的sql语句
        memset(buf,0,sizeof(buf));

        recv(socket_ok,buf,sizeof(buf),0);//阻塞等待,接收操作标志位
        printf("服务端接收到 %s 号操作\n",buf);

        int input = atoi(buf);

        switch (input)
        {
        case 1:
            add(mydb);
            break;
        case 2:
            delete_info(mydb);
            break;
        case 3:
            update(mydb);
            break;
        case 4:
            select_info(mydb);
            break;
        case 5:
            select_one(mydb);
            break;
        case 6:
            sel_stu_tea(mydb);
            break;
        case 7:
            add_tea(mydb);
            break;
        case 8:
            select_tea(mydb);
            break;
        case 9:
            avg(mydb);
            break;
        case 10:
            login(mydb);
            break;
        case 11:
            user_register(mydb);
            break;
        case 12:
            dict(mydb);
            break;
        case 13:
            dict_history(mydb);
            break;
        case 0:
            exit(0);
            break;
        
        default:
            printf("输入错误,请重新输入\n");
            break;
        }


    }

    close(socket_fd);
    close(socket_ok);

    return 0;
}

manager_student_client3.c

#include 
#include
#include
#include
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#include


//基于TCP通信,使用数据库完成学生信息管理系统,并增加电子词典功能
//客户端

int socket_fd = -1;
char result[4096];

//查找操作
void select_info(){

    //发送操作标志位
    char buf[128] = "4";
    //客户端发送拼接好的sql字符串给服务端
    send(socket_fd,buf,strlen(buf),0);

    //接收消息
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);//阻塞等待

    if(result[0] != '\0'){
        printf("%s\n",result);
    }else{
        printf("查询失败\n");
    }
        

}

//增加操作
void add(){
    //发送操作标志位给服务器
    char buf[12] = "1";
    send(socket_fd,buf,strlen(buf),0);

    char id[12];
    printf("请输入学生学号:");
    scanf("%s",id);

    char name[22];
    printf("请输入学生姓名:");
    scanf("%s",name);
    
    char sex[12];
    printf("请输入学生性别:");
    scanf("%s",sex);

    char score[12];
    printf("请输入学生成绩:");
    scanf("%s",score);

    //定义sql语句
    char sql[256];
    //拼接sql语句
    snprintf(sql,sizeof(sql),"insert into student(id,name,sex,score)values('%s','%s','%s','%s');",id,name,sex,score);

    

    //发送sql数据给服务器
    send(socket_fd,sql,strlen(sql),0);

    //接收消息
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);//阻塞等待

    if(strcmp(result,"1")==0){
        printf("添加成功\n");
    }else{
        printf("添加失败\n");
    }

}

//删除操作
void delete_info(){

    //发送操作标志位
    char buf[12] = "2";
    send(socket_fd,buf,sizeof(buf),0);

    //发送要删除的名字
    char name[12];
    printf("请输入你要删除的学生姓名:");
    scanf("%s",name);
    send(socket_fd,name,strlen(name),0);

    //接收结果
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);
    if(strcmp(result,"0")==0){
        printf("删除成功\n");
    }else if(strcmp(result,"-1")==0){
        printf("删除失败\n");
    }


}

//修改操作
void update(){

    //发送操作标志位
    char buf[12] = "3";
    send(socket_fd,buf,sizeof(buf),0);


    char name[12];
    printf("请输入你要修改的学生姓名:");
    scanf("%s",name);
    //发送要修改人的姓名
    send(socket_fd,name,strlen(name),0);

    //接收结果
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);
    if(strcmp(result,"-1")==0){
        printf("要修改的人不存在\n");
        return;
    }else if(result,"1"){
        printf("名字合法\n");
    }

    //我的删除思路就是重新添加
    char id[12];
    printf("请 重新 输入学生学号:");
    scanf("%s",id);

    char name2[12];
    printf("请 重新 输入学生姓名:");
    scanf("%s",name2);
    
    char sex[12];
    printf("请 重新 输入学生性别:");
    scanf("%s",sex);

    char score[12];
    printf("请 重新 输入学生成绩:");
    scanf("%s",score);

    //定义sql语句
    char sql2[256];
    //拼接sql语句
    snprintf(sql2,sizeof(sql2),"update student set id='%s',name='%s',sex='%s',score='%s' where name = '%s';",id,name2,sex,score,name);
    //向服务端发送sql数据
    send(socket_fd,sql2,strlen(sql2),0);
    //接收结果
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);
    if(strcmp(result,"0")==0){
        printf("修改成功\n");
    }

}


//计算平均分
void avg(){

    //发送操作标志位
    char buf[12] = "9";
    send(socket_fd,buf,sizeof(buf),0);

    //接收结果
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);
    
    printf("平均分为:%s\n",result);//保留两位小数
}

//查找一个学生信息
void select_one(){

    //发送操作标志位
    char buf[12] = "5";
    send(socket_fd,buf,sizeof(buf),0);

    char name[12];
    printf("请输入你要查找的学生姓名:");
    // memset(name,0,sizeof(name));
    scanf("%s",name);
    //向服务端发送数据
    send(socket_fd,name,strlen(name),0);


    //接收消息
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);

    if(result[0] != '\0'){
        printf("%s\n",result);
    }else{
        printf("查询失败\n");
    }
}


//查询学生老师信息
void sel_stu_tea(){
    //发送操作标志位
    char buf[12] = "6";
    send(socket_fd,buf,sizeof(buf),0);

    char name[12];
    printf("请输入你要查询的学生姓名:");
    scanf("%s",name);
    send(socket_fd,name,strlen(name),0);
  
    //接收消息
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);//阻塞等待

    if(result[0] != '\0'){
        printf("%s\n",result);
    }else{
        printf("查询失败\n");
    }

}

//给学生添加一个老师
void add_tea(){

    //发送操作标志位
    char buf[12] = "7";
    send(socket_fd,buf,sizeof(buf),0);

    char name[12];
    printf("请输入老师姓名:");
    scanf("%s",name);
    
    char sex[12];
    printf("请输入老师性别:");
    scanf("%s",sex);

    char teacher_stu[12];
    printf("请输入学生姓名:");
    scanf("%s",teacher_stu);


    //定义sql语句
    char sql[256];
    //拼接sql语句
    snprintf(sql,sizeof(sql),"insert into teacher(name,sex,teacher_stu)values('%s','%s','%s');",name,sex,teacher_stu);
    //发送数据给服务器
    send(socket_fd,sql,strlen(sql),0);


    //接收消息
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);//阻塞等待

    if(strcmp(result,"1")==0){
        printf("添加成功\n");
    }else{
        printf("添加失败\n");
    }

}

//查找所有老师信息
void select_tea(){

    //发送操作标志位
    char buf[12] = "8";
    send(socket_fd,buf,sizeof(buf),0);

    //接收消息
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);//阻塞等待

    if(result[0] != '\0'){
        printf("%s\n",result);
    }else{
        printf("查询失败\n");
    }

}

//登录管理
int login(){

    //发送操作标志位
    char buf[12] = "10";
    send(socket_fd,buf,sizeof(buf),0);

    char id[12];
    printf("请输入4位账号:");
    scanf("%s",id);
    //发送账号
    send(socket_fd,id,strlen(id),0);

    char password[12];
    printf("请输入3位密码:");
    scanf("%s",password);
    //发送密码
    send(socket_fd,password,strlen(password),0);

    //接收消息
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);//阻塞等待

    if(result[0] != '\0'){//有账号且密码正确
        return 1;
    }else{//无账号或账号密码错误
        return -1;
    }

}

//注册管理
void user_register(){

    //发送操作标志位
    char buf[12] = "11";
    send(socket_fd,buf,sizeof(buf),0);

    char id[12];
    printf("请输入4位账号:");
    scanf("%s",id);
    send(socket_fd,id,strlen(id),0);

    char password[12];
    printf("请输入3位密码:");
    scanf("%s",password);
    send(socket_fd,password,strlen(password),0);

    //接收消息
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);//阻塞等待

    if(strcmp(result,"1")==0){//注册成功
        printf("账号注册成功\n");
    }else if(strcmp(result,"-1")==0){//账号非法
        printf("账号重复,请重新输入\n");
    }
}

//退出
void quit(){
    //发送操作标志位
    char buf[12] = "0";
    send(socket_fd,buf,sizeof(buf),0);

}

//字典功能
void dict(){

    //发送操作标志位
    char buf[12] = "12";
    send(socket_fd,buf,sizeof(buf),0);


    char search[30];
    printf("请输入你要查询的单词:");
    scanf("%s",search);
    //发送给服务端查询
    send(socket_fd,search,strlen(search),0);

    //接收查询结果
    //接收消息
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);
    if(strcmp(result,"-1")==0){
        printf("抱歉你的输入有误  或者  本词典没有收录此单词\n");
    }else{
        printf("%s\n",result);
    }
    
}

//查看单词查询记录
void dict_history(){
    //发送操作标志位
    char buf[128] = "13";
    //客户端发送拼接好的sql字符串给服务端
    send(socket_fd,buf,strlen(buf),0);

    //接收消息
    memset(result,0,sizeof(result));
    recv(socket_fd,result,sizeof(result),0);//阻塞等待

    if(result[0] != '\0'){
        printf("%s\n",result);
    }else{
        printf("查询失败\n");
    }
}

void menu(){
    printf("*********************************************************\n");
    printf("****       1. add                     2. delete      ****\n");
    printf("****       3. update                  4. select      ****\n");
    printf("****       5. select_one              6. sel_stu_tea ****\n");
    printf("****       7. add_tea                 8. select_tea  ****\n");
    printf("****       9. avg                     10. dict       ****\n");
    printf("****       11.dict_history            0. exit        ****\n");
    printf("*********************************************************\n");
}

void menu2(){
    printf("*********************************************************\n");
    printf("****       1.login                     2.register    ****\n");
    printf("*********************************************************\n");
}

void caidan(){
    int input;
    do{

        printf("\n");
        sleep(1);
        menu();
        printf("请输入你的操作:");
        scanf("%d",&input);

        switch (input)
        {
        case 1:
            add();
            break;
        case 2:
            delete_info();
            break;
        case 3:
            update();
            break;
        case 4:
            select_info();
            break;
        case 5:
            select_one();
            break;
        case 6:
            sel_stu_tea();
            break;
        case 7:
            add_tea();
            break;
        case 8:
            select_tea();
            break;
        case 9:
            avg();
            break;
        case 10:
            dict();
            break;
        case 11:
            dict_history();
            break;
        case 0:
            quit();
            break;
        
        default:
            printf("输入错误,请重新输入\n");
            break;
        }

    }while(input);
}

int main(int argc,char** argv)
{
    
    //1. 创建套接字
    socket_fd = socket(AF_INET,SOCK_STREAM,0);
    if(socket_fd == -1){
        printf("创建套接字失败\n");
        return -1;
    }

    //2.初始化服务端网络地址
    struct sockaddr_in s_addr;
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(atoi(argv[2]));
    s_addr.sin_addr.s_addr = inet_addr(argv[1]);
    
    //3. 请求连接
    connect(socket_fd,(struct sockaddr*)&s_addr,sizeof(s_addr));

    //先登录
    int in;
    do{
        printf("\n");
        sleep(1);
        menu2();
        printf("请输入你的操作:");
        scanf("%d",&in);
        int ret = -1;
        switch (in)
        {
        case 1:
            ret = login();
            if(ret==1){
                printf("登录成功\n");
                caidan();
                exit(0);
            }else if(ret == -1){
                printf("账号或者密码错误\n");
            }
            break;
        case 2:
            user_register();
            break;
        default:
            printf("输入错误,请重新选择\n");
            break;
        }
    }while(in);


    close(socket_fd);
    return 0;
}

你可能感兴趣的:(Sqlite,数据库,sqlite,c语言,linux,tcp/ip)