SQLite:电子词典

服务器部分代码段:

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #define N 16 #define R 1 // user register #define L 2 // user login #define Q 3 // query word #define H 4 // history record #define DATABASE "my.db" typedef struct { int type; char name[N]; char data[256]; // password or word } MSG; void do_register(int connectfd, MSG *msg, sqlite3 *db); void do_login(int connectfd, MSG *msg, sqlite3 *db); void do_query(int connectfd, MSG *msg, sqlite3 *db); void do_history(int connectfd, MSG *msg, sqlite3 *db); void do_client(int connectfd, sqlite3 *db); int do_searchword(int connectfd, MSG *msg); void getdata(char data[]); int main(int argc, char *argv[]) { int listenfd, connectfd; //监听套接字和连接套接字 struct sockaddr_in server_addr; //服务器结构体 pid_t pid; //进程号 sqlite3 *db; if (argc < 3) //参数监测 { printf("Usage : %s 
              
              
                \n", argv[0]); exit(-1); } /*打开数据库 my.db,如果没有则创建,创建失败则退出*/ if (sqlite3_open(DATABASE, &db) != SQLITE_OK) { printf("error : %s\n", sqlite3_errmsg(db)); exit(-1); } /*创建一个监听套接字*/ if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { perror("fail to socket"); exit(-1); } /*服务器结构体内清零*/ bzero(&server_addr, sizeof(server_addr)); /*设置服务器工作模式为IPV4并输入服务器地址和端口号*/ server_addr.sin_family = PF_INET; server_addr.sin_addr.s_addr = inet_addr(argv[1]); server_addr.sin_port = htons(atoi(argv[2])); /*将监听套接字与服务器结构体相关长度进行绑定*/ if (bind(listenfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("fail to bind"); exit(-1); } /*设置服务器进程,并指定请求队列长度为5*/ if (listen(listenfd, 5) < 0) { perror("fail to listen"); exit(-1); } /*避免僵尸进程的出现*/ signal(SIGCHLD, SIG_IGN); /**/ while ( 1 ) { /*创建连接套接字,原有监听套接字保持其状态,失败则退出*/ if ((connectfd = accept(listenfd, NULL, NULL)) < 0) { perror("fail to accept"); exit(-1); } /*创建子进程,失败则退出*/ if ((pid = fork()) < 0) { perror("fail to fork"); exit(-1); } /*进入子进程*/ if (pid == 0) { /*处理客户请求*/ do_client(connectfd, db); } /*父进程关闭连接套接字*/ close(connectfd); } return 0; } void do_register(int connectfd, MSG *msg, sqlite3 *db) { char sqlstr[128] = {0}; char *errmsg; /*创建sql语句,向数据库中插入一个成员信息(账号和密码)*/ sprintf(sqlstr, "insert into usr values('%s', '%s')", msg->name, msg->data); /*在DB中执行上述创建好的语句,如果出错则返回,如果成功结束则向客户端返回OK*/ if(sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg) != SQLITE_OK) { sprintf(msg->data, "user %s already exist!!!", msg->name); } else { strcpy(msg->data, "OK"); } /*向连接套接字中发送刚才拷贝的“OK”*/ send(connectfd, msg, sizeof(MSG), 0); return; } void do_login(int connectfd, MSG *msg, sqlite3 *db) { char sqlstr[128] = {0}; char *errmsg, **result; int nrow, ncolumn; //行列 /*拷贝SQL语句*/ sprintf(sqlstr, "select * from usr where name = '%s' and pass = '%s'", msg->name, msg->data); /*执行语句,如果错误则打印错误信息*/ if(sqlite3_get_table(db, sqlstr, &result, &nrow, &ncolumn, &errmsg) != SQLITE_OK) { printf("error : %s\n", errmsg); } /*如果判断输入之后 行数依然是0,则说明输入失败*/ if(nrow == 0) { strcpy(msg->data, "name or password is wrony!!!"); } /*输入成功*/ else { strncpy(msg->data, "OK", 256); } /*发送“OK”*/ send(connectfd, msg, sizeof(MSG), 0); return; } int do_searchword(int connectfd, MSG *msg) { FILE *fp; //创建文件流 char temp[300]; //创建缓冲区 char *p; //字符位置 int len, result; //长度以及返回的行 len = strlen(msg->data); //长度赋值 /*使用标注IO以只读方式打开文件*/ if((fp = fopen("dict.txt", "r")) == NULL) { /*打开失败则发送失败信息至客户端*/ strcpy(msg->data, "dict can not open"); send(connectfd, &msg, sizeof(MSG), 0); } /*打印出被查询的单词*/ printf("query word is %s len = %d\n", msg->data, len); /*获取长度为300的字符串保存至temp*/ while(fgets(temp, 300, fp) != NULL) { //usleep(10); result = strncmp(msg->data, temp, len); if(result > 0) continue; if(result < 0 || temp[len] != ' ')break; p = temp + len; while(*p == ' ')p++; /*保存至数据中*/ strcpy(msg->data, p); /*关闭文件*/ fclose(fp); puts("return 1"); return 1; } /*关闭文件*/ fclose(fp); return 0; } void do_history(int connectfd, MSG *msg, sqlite3 *db) { /*返回*/ return; } void getdata(char data[]) { time_t t; struct tm *tp; time(&t); tp = localtime(&t); sprintf(data, "%d-%d-%d %d:%d:%d", tp->tm_year, tp->tm_mon, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec); } void do_query(int connectfd, MSG *msg, sqlite3 *db) { /*打印出请求命令为查询*/ puts("query"); /*创建信息以及错误信息的指针*/ char sqlstr[128], *errmsg; int found = 0; char date[128], word[128]; strcpy(word, msg->data); found =do_searchword(connectfd, msg); if(found) { getdata(date); sprintf(sqlstr, "insert into record values('%s', '%s', '%s')", msg->name, date, word); if(sqlite3_exec(db, sqlstr, NULL, NULL, &errmsg) != SQLITE_OK) { printf("error : %s\n", errmsg); } } else { strcpy(msg->data, "not found"); } send(connectfd, msg, sizeof(MSG), 0); return; } void do_client(int connectfd, sqlite3 *db) { MSG msg; while (recv(connectfd, &msg, sizeof(MSG), 0) > 0) // 接收客户请求 { /*打印请求类型*/ printf("type = %d\n", msg.type); /*打印请求的数据*/ printf("type = %s\n", msg.data); /*按照请求类型进行数据处理*/ switch ( msg.type ) { case R : do_register(connectfd, &msg, db); break; case L : do_login(connectfd, &msg, db); break; case Q : do_query(connectfd, &msg, db); break; case H : do_history(connectfd, &msg, db); break; } } printf("client quit\n"); exit(0); return; } 
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   

客户端部分代码段:

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
         #include 
        
          #include 
         
           #include 
          
            #define N 16 #define R 1 // user register #define L 2 // user login #define Q 3 // query word #define H 4 // history record #define DATABASE "my.db" /*通信用结构体*/ typedef struct { int type; char name[N]; char data[256]; // password or word or remark } MSG; void do_register(int socketfd, MSG *msg); int do_login(int socketfd, MSG *msg); void do_query(int socketfd, MSG *msg); void do_history(int socketfd, MSG *msg); int main(int argc, char *argv[]) { int socketfd ; //套接字描述符 struct sockaddr_in server_addr; //服务器结构体 MSG msg; //通信结构体 if (argc < 3) //输入参数不符合规定 { printf("Usage : %s 
            
            
              \n", argv[0]); exit(-1); } /*创建套接字,并验证是否正确,不正确退出*/ if ((socketfd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { perror("fail to socket"); exit(-1); } /*结构体内部清零*/ bzero(&server_addr, sizeof(server_addr)); /*确定服务器传输模式为IPV4,并确定IP地址和端口号*/ server_addr.sin_family = PF_INET; server_addr.sin_addr.s_addr = inet_addr(argv[1]); server_addr.sin_port = htons(atoi(argv[2])); /*创建一个连接套接字,失败则退出*/ if (connect(socketfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("fail to connect"); exit(-1); } int n;/*指令存储*/ while(1) { /*打印界面*/ printf("************************************\n"); printf("* 1: register 2: login 3: quit *\n"); printf("************************************\n"); printf("please choose : "); /*接收指令,错误则退出*/ if(scanf("%d", &n) <= 0) { perror("scanf"); exit(-1); } /*指令选择*/ switch(n) { case 1: /*注册一个用户*/ do_register(socketfd, &msg); break; case 2: /*判定登录用户*/ if(do_login(socketfd, &msg) == 1) goto next;/*如果登陆成功则跳向NEXT*/ break; case 3: /*退出,关闭连接套接字*/ close(socketfd); exit(0); } } next: while(1) { /*界面表格*/ printf("************************************\n"); printf("* 1: query 2: history 3: quit *\n"); printf("************************************\n"); printf("please choose : "); /*功能选择*/ if(scanf("%d", &n) <= 0) { fprintf(stderr,"%s %s %d %s\n",__FILE__,__FUNCTION__,__LINE__,); } switch(n) { case 1: do_query(socketfd, &msg); break; case 2: do_history(socketfd, &msg); break; case 3: close(socketfd); exit(0); } } return 0; } void do_register(int socketfd, MSG *msg) { msg->type = R; //状态宏设置 printf("input your name:"); scanf("%s", msg->name); printf("input your password:"); scanf("%s", msg->data); send(socketfd, msg, sizeof(MSG), 0); recv(socketfd, msg, sizeof(MSG), 0); printf("register : %s\n", msg->data); return; } int do_login(int socketfd, MSG *msg) { msg->type = L; printf("input your name:"); scanf("%s", msg->name); printf("input your password:"); scanf("%s", msg->data); send(socketfd, msg, sizeof(MSG), 0); recv(socketfd, msg, sizeof(MSG), 0); if(strncmp(msg->data, "OK", 3) == 0) { printf("login : OK\n"); return 1; } printf("login : %s\n", msg->data); return 0; } void do_query(int socketfd, MSG *msg) { msg->type = Q; puts("---------"); while(1) { printf("input word : "); scanf("%s", msg->data); if(strcmp(msg->data, "#") == 0)break; printf("type = %d\n", msg->type); send(socketfd, msg, sizeof(MSG), 0); printf("type = %d\n", msg->type); recv(socketfd, msg, sizeof(MSG), 0); printf(" %s\n", msg->data); } return; } void do_history(int socketfd, MSG *msg) { puts("history"); } 
             
            
           
          
         
       
      
      
     
     
    
    
   
   

另外需要使用到 dict.txt作为文件源


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值