逻辑清晰,框架规范的在线电子词典源程序
C语言源程序如下:
- #include <stdio.h>
- #include <string.h>
- #include <sqlite3.h>
- #define MAXLEN_DATA 256
- int main ()
- {
- char buff[MAXLEN_DATA]={0};
- FILE *fp;
- int i= 0;
- char word[35]="\0";
- char *p;
- char meaning[256];
- char sql_cmd[128];
- char *errmsg;
- sqlite3 *db;
- /*查找单词*/
- if ((fp = fopen("dict.txt", "r")) == NULL)
- {
- perror("fail to open");
- return -1;
- }
- if( sqlite3_open("wmk.db", &db) != SQLITE_OK)
- {
- printf("fail to open %s\n",sqlite3_errmsg(db));
- }
- while (fgets(buff, MAXLEN_DATA, fp) != NULL)
- {
- i= 0;
- p= buff;
- while (*p != ' ')
- {
- word[i] = *p;
- i++;
- p++;
- continue;//跳过第一个单词
- }
- word[i] = '\0';
- while (*(++p) == ' ')
- {
- continue;//跳过单词后面的空格
- }
- strcpy(meaning,p);
- sprintf(sql_cmd,"insert into word values('%s','%s')",word,meaning);
- if(sqlite3_exec(db, sql_cmd,NULL,NULL,&errmsg) != SQLITE_OK)
- {
- printf("fail exec\n");
- }
- }
- if( sqlite3_close(db) != SQLITE_OK)
- {
- printf("fail to close %s\n",sqlite3_errmsg(db));
-
- }
- return 0;
- }
复制代码- /*************************************************************************
- > File Name: dict_server.c
- > Author: WangMingkai
- > Created Time: Sun 22 Apr 2018 06:40:59 PM CST
- ************************************************************************/
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<fcntl.h>
- #include<sys/socket.h>
- #include<unistd.h>
- #include<netinet/in.h>
- #include<arpa/inet.h>
- #include<sqlite3.h>
- #include<signal.h>
- #include<time.h>
- #include<pthread.h>
- #include<time.h>
- //定义用户数据结构体
- struct message_user
- {
- char name[24];
- char password[24];
- char telephone[24];
- char address[24];
-
- char word[18];
- char meaning[256];
-
- char record[48][24];//存放查找结果内容的数组
- char head[6][24]; //存放查找结果字段名称的数组
-
- int state; //用户在线状态
- int nrow; //数据库函数执行后得到记录的数目
- int ncolumn;//数据库函数执行后得到字段的数目
-
- int flag; //客户端发送的命令
-
- int err; //判断执行数据库函数后是否成功
-
- int binary; //判断查询历史记录的方式,0/姓名,1/单词
-
- int update; //修改个人信息选项,0/密码,1/电话,2/地址
- };
- typedef struct message_user Mess_user;
- char buffer1[256]={0};
- int fd;
- time_t timep;
- //使用多线程来实现并发服务器
- void *fun_pthread(void *arg)
- {
- int accept_sock_fd = *(int *)arg;
- int addrlen;
- Mess_user user;
- char word[18] = {0};
- char sql_cmd1[128] = {0};
- char sql_cmd2[128] = {0};
- time_t t;
- int flag;
- free(arg);
- char buff[128];
- char time_c[30];
-
- int num = 1;
- int i, j, index;
- char **resultp;
- int nrow, ncolumn;
- sqlite3 *db;
- char *errmsg;
- //打开sqlite3数据库
- if(sqlite3_open("wmk.db", &db) != 0)
- {
- perror("fail open sqlite3");
- exit(-1);
- }
- while(1)
- {
- if(read(accept_sock_fd, &user, sizeof(struct message_user)) == -1)
- {
- perror("fail recv flag");
- exit(-1);
- }
- switch(user.flag)
- {
- case 1:
- //向数据库中插入用户名信息
- read(accept_sock_fd, &user, sizeof(struct message_user));
- sprintf(sql_cmd1,"select * from user where name='%s'",user.name);
- if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
- {
- printf("fail exec %s\n",errmsg);
- exit(-1);
- }
- if(nrow != 0)
- {
- user.err = 1;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- break;
- }
- if(nrow == 0)
- {
- user.err = 0;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- read(accept_sock_fd, &user, sizeof(struct message_user));
- sprintf(sql_cmd2,"insert into user values ('%s','%s','%s','%s', %d)", user.name, user.password, user.telephone, user.address, user.state);
-
- if(sqlite3_get_table(db, sql_cmd2, &resultp, &nrow, &ncolumn, &errmsg) != 0)
- {
- printf("fail exec %s\n",errmsg);
- exit(-1);
- }
-
- user.err = 0;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- time(&timep);//参数是能返回 time_t 型对象 的指针 timer ,那里存放着当时时间。
- strcpy(time_c, ctime(&timep));
- sprintf(buff, "%s用户%s注册\n", time_c, user.name);
- write(fd, buff, strlen(buff));
-
- }
- break;
- //用户开始登录
- case 2:
-
- read(accept_sock_fd, &user, sizeof(struct message_user));
- sprintf(sql_cmd1,"select * from user where name='%s'",user.name);
-
- if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
- {
-
- printf("fail exec %s\n",errmsg);
- exit(-1);
- }
- if( nrow == 0 )
- {
- user.err = 1;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- break;
-
- }
- if( nrow == 1)
- {
- user.err = 0;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- while(num != 0)
- {
- read(accept_sock_fd, &user, sizeof(struct message_user));
- sprintf(sql_cmd2,"select password from user where name='%s'",user.name);
-
- if(sqlite3_get_table(db, sql_cmd2, &resultp, &nrow, &ncolumn, &errmsg) != 0)
- {
- printf("fail exec %s\n",errmsg);
- exit(-1);
- }
- num = strcmp(user.password, resultp[ncolumn]);
- if(num == 0)
- {
- user.err = 0;//登录成功
- sprintf(sql_cmd1, "update user set state=1 where name='%s'", user.name);
- sqlite3_exec(db, sql_cmd1, NULL, NULL,&errmsg);
- time(&timep);
- strcpy(time_c, ctime(&timep));
- sprintf(buff, "%s用户%s登录\n", time_c, user.name);
- write(fd, buff, strlen(buff));
- }
- if(num != 0)
- {
- user.err = 1;//登录失败
- }
- write(accept_sock_fd, &user, sizeof(struct message_user));
- }
- }
- break;
- case 3:
- //开始查找单词含义,在数据库中插入查找时间戳记录,并把查找结果发送给客户端
- if(read(accept_sock_fd, &user, sizeof(struct message_user)) == -1)
- {
- perror("fail recv word");
- exit(-1);
- }
- sprintf(sql_cmd1,"select meaning from word where word='%s'",user.word);
-
- if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
- {
- printf("fail exec %s\n",errmsg);
- exit(-1);
- }
- if(nrow == 0)
- {
- user.err = 1;
- write(accept_sock_fd, &user,sizeof(struct message_user));
- break;
- }
- if(nrow != 0)
- {
- strcpy(user.meaning, resultp[ncolumn]);
- user.err = 0;
- write(accept_sock_fd, &user,sizeof(struct message_user));
- sprintf(sql_cmd1, "insert into record values ('%s','%s')", user.name, user.word);
- if(sqlite3_exec(db,sql_cmd1, NULL, NULL, &errmsg) != 0)
- {
- printf("fail ecec %s\n",errmsg);
- exit(-1);
- }
- time(&timep);
- strcpy(time_c, ctime(&timep));
- sprintf(buff, "%s用户%s查找单词%s\n", time_c, user.name, user.word);
- write(fd, buff, strlen(buff));
-
- break;
- }
- case 4:
- //查找历史记录
- read(accept_sock_fd, &user, sizeof(struct message_user));
- if(user.binary == 0)
- {
- sprintf(sql_cmd1,"select word from record where name='%s'",user.name);
- }
- if(user.binary == 1)
- {
- sprintf(sql_cmd1,"select name from record where word='%s'",user.word);
- }
- if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
- {
- printf("fail exec %s\n",errmsg);
- exit(-1);
- }
- if( nrow == 0 )
- {
- user.err = 1;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- break;
- }
- if( nrow != 0)
- {
- user.err = 0;
- j = ncolumn;
- for(i = 0; i < nrow; i++)
- {
- strcpy(user.record[i], resultp[j++]);
- }
- user.nrow = nrow;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- time(&timep);
- strcpy(time_c, ctime(&timep));
- sprintf(buff, "%s用户%s查看历史记录\n", time_c, user.name);
- write(fd, buff, strlen(buff));
-
- }
- break;
- case 5:
- //查看个人信息
- read(accept_sock_fd, &user, sizeof(struct message_user));
- sprintf(sql_cmd1, "select * from user where name='%s'", user.name);
- sqlite3_exec(db, ".header on", NULL, NULL, &errmsg);
- sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg);
- sqlite3_exec(db, ".header off", NULL, NULL, &errmsg);
- if( nrow == 0 )
- {
- user.err = 1;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- break;
- }
- if( nrow != 0)
- {
- user.err = 0;
- index = ncolumn;
- for(i = 0; i < nrow; i++)
- {
- for(j = 0; j < ncolumn; j++)
- {
- strcpy(user.record[j], resultp[index++]);
- strcpy(user.head[j], resultp[j]);
- }
- }
- user.nrow = nrow;
- user.ncolumn = ncolumn;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- time(&timep);
- strcpy(time_c, ctime(&timep));
- sprintf(buff, "%s用户%s查看个人信息\n", time_c, user.name);
- write(fd, buff, strlen(buff));
-
- }
-
- break;
- case 6:
- //修改个人信息
- read(accept_sock_fd, &user, sizeof(struct message_user));
- if(user.update == 0)
- {
-
- sprintf(sql_cmd1,"select password from user where name='%s'",user.name);
- sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg);
- num = strcmp(user.password, resultp[ncolumn]);
- if(num != 0)
- {
- user.nrow = 0;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- break;
- }
- if(num == 0)
- {
- user.nrow = 1;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- read(accept_sock_fd, &user, sizeof(struct message_user));
-
- sprintf(sql_cmd2,"update user set password='%s' where name='%s'", user.password, user.name);
- if(sqlite3_get_table(db, sql_cmd2, &resultp, &nrow, &ncolumn, &errmsg) != 0)
- {
- user.err = 1;
- }
- else
- user.err = 0;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- time(&timep);
- strcpy(time_c, ctime(&timep));
- sprintf(buff, "%s用户%s修改个人密码为%s\n", time_c, user.name, user.password);
- write(fd, buff, strlen(buff));
- break;
-
- }
- }
- if(user.update == 1)
- {
- sprintf(sql_cmd1,"update user set telephone='%s' where name='%s'", user.telephone, user.name);
- if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
- {
- user.err = 1;
- }
- else
- user.err = 0;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- time(&timep);
- strcpy(time_c, ctime(&timep));
- sprintf(buff, "%s用户%s修改个人电话为%s\n", time_c, user.name, user.telephone);
- write(fd, buff, strlen(buff));
- break;
-
- }
- if(user.update == 2)
- {
- sprintf(sql_cmd1,"update user set address='%s' where name='%s'", user.address, user.name);
- if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
- {
- user.err = 1;
- }
- else
- user.err = 0;
- write(accept_sock_fd, &user, sizeof(struct message_user));
- time(&timep);
- strcpy(time_c, ctime(&timep));
- sprintf(buff, "%s用户%s修改个人地址为%s\n", time_c, user.name, user.address);
- write(fd, buff, strlen(buff));
- break;
- }
-
- case 0:
- //关闭数据
- read(accept_sock_fd, &user, sizeof(struct message_user));
- sprintf(sql_cmd1, "update user set state=0 where name='%s'", user.name);
- sqlite3_exec(db, sql_cmd1, NULL, NULL,&errmsg);
- time(&timep);
- strcpy(time_c, ctime(&timep));
- sprintf(buff, "%s用户%s退出\n", time_c, user.name);
- write(fd, buff, strlen(buff));
- break;
- }
- if(user.flag == 0)
- break;
- }
- sqlite3_close(db);
- pthread_exit(NULL);
- }
- //管理员模式显示所有用户
- void fun_admin_show(sqlite3 *db)
- {
-
- char *errmsg, **resultp;
- int nrow, ncolumn, i, j, index;
- if(sqlite3_get_table(db, "select * from user", &resultp, &nrow, &ncolumn, &errmsg) != 0)
- {
- printf("fail admin show : %s\n",errmsg);
- return;
- }
- index = ncolumn;
- for(i = 0; i < nrow; i++)
- {
- for(j = 0; j < ncolumn; j++)
- {
- printf("%s:%s\n", resultp[j], resultp[index++]);
- }
- printf("-------------------------------------\n");
- }
- }
- //管理员模式修改用户信息
- void fun_admin_alter(sqlite3 *db)
- {
- char name[24];
- char telephone[24];
- char address[24];
- int alter_cmd;
- char sql[128];
- char *errmsg, **resultp;
- int nrow, ncolumn, i, j, index;
- while(1)
- {
- printf("请输入您要修改的用户名:");
- scanf("%s",name);
- sprintf(sql, "select * from user where name='%s'",name);
- sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg);
- if(nrow == 0)
- {
- printf("没有此用户,请更换用户名\n");
- }
- if(nrow != 0)
- {
- while(1)
- {
- printf("请输入您要修改的属性(0/电话,1/地址):");
- scanf("%d",&alter_cmd);
- if(alter_cmd > 1 || alter_cmd < 0)
- {
- printf("输入错误,请重新输入\n");
- }
- else
- {
- if(alter_cmd == 0)
- {
- printf("请输入需要更改的新电话号码:");
- scanf("%s",telephone);
- sprintf(sql, "update user set telephone='%s' where name='%s'", telephone, name);
- if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg) == 0)
- {
- printf("更改成功!\n");
- break;
- }
- }
- if(alter_cmd == 1)
- {
- printf("请输入需要更改的新地址:");
- scanf("%s",address);
- sprintf(sql, "update user set address='%s' where name='%s'", address, name);
- if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg) == 0)
- {
- printf("更改成功!\n");
- break;
- }
- }
- }
- }
- break;
-
- }
- }
- }
- //管理员模式添加用户
- void fun_admin_add(sqlite3 *db)
- {
- char name[24];
- char password[24];
- char telephone[24];
- char address[24];
- int state;
- char sql[128];
- char *errmsg, **resultp;
- int nrow, ncolumn, i, j, index;
-
- while(1)
- {
- printf("请输入您要添加的用户名:");
- scanf("%s",name);
- sprintf(sql, "select * from user where name='%s'",name);
- sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg);
- if(nrow == 1)
- {
- printf("该用户已存在,请更换用户名\n");
- }
- if(nrow == 0)
- {
- printf("请输入您的密码:");
- scanf("%s",password);
- printf("请输入您的电话:");
- scanf("%s",telephone);
- printf("请输入您的地址:");
- scanf("%s",address);
- state = 0;
- sprintf(sql, "insert into user values ('%s', '%s', '%s', '%s', %d)", name, password, telephone, address, state);
- if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) == 0)
- {
- printf("添加成功!");
- break;
- }
- else
- {
- printf("添加失败\n");
- }
- }
- }
- }
- //管理员删除用户
- void fun_admin_delete(sqlite3 *db)
- {
- char name[24];
- char sql[128];
- char *errmsg, **resultp;
- int nrow, ncolumn;
- while(1)
- {
- printf("请输入您要删除的用户名:");
- scanf("%s", name);
- sprintf(sql, "select * from user where name='%s'",name);
- sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg);
- if(nrow == 0)
- {
- printf("该用户不存在,请更换用户名\n");
- }
- if(nrow != 0)
- {
-
- sprintf(sql, "delete from user where name='%s'",name);
- if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg) == 0)
- {
- printf("删除用户成功\n");
- break;
- }
- }
- }
- }
- //服务器的管理员模式
- void *fun_admin_pthread()
- {
- int f_cmd;
- char name[24];
- char telephone[24];
- char address[24];
- char admin;
- sqlite3 *db;
- if(sqlite3_open("wmk.db", &db) != 0)
- {
- perror("fail open sqlite3");
- exit(-1);
- }
- while(1)
- {
- printf("请按A进入管理员模式\n");
- scanf("%c",&admin);
- if(admin == 'A')
- {
- system("clear");
- printf("*********************************\n");
- printf("管理员模式开启\n");
- printf("*********************************\n");
- printf("1:显示所有用户信息\n");
- printf("2:修改用户信息\n");
- printf("3:添加用户\n");
- printf("4:删除用户\n");
- printf("0:退出\n");
- printf("*********************************\n");
- while(f_cmd)
- {
- printf("请输入您要进行的操作:");
- scanf("%d",&f_cmd);
- if(f_cmd < 0 || f_cmd > 4)
- {
- printf("输入有误,请重新输入\n");
- }
- switch(f_cmd)
- {
- case 1:
- fun_admin_show(db);
- break;
- case 2:
- fun_admin_alter(db);
- break;
- case 3:
- fun_admin_add(db);
- break;
- case 4:
- fun_admin_delete(db);
- break;
- case 0:
- break;
- }
- if(f_cmd == 0)
- {
- break;
- }
- printf("请按回车键继续:");
- getchar();
- while(getchar() != '\n')
- {
- ;
- }
- system("clear");
- printf("*********************************\n");
- printf("管理员模式开启\n");
- printf("*********************************\n");
- printf("1:显示所有用户信息\n");
- printf("2:修改用户信息\n");
- printf("3:添加用户\n");
- printf("4:删除用户\n");
- printf("0:退出\n");
- printf("*********************************\n");
- }
- }
- }
- }
- int main(int argc, char *argv[])
- {
- Mess_user user;
- int sock_fd, accept_sock_fd, addrlen;
- pthread_t pid, f_pid;
- int *fun_sockfd = NULL;
- char word[18] = {0};
- char sql_cmd[128] = {0};
- int flag;
- sqlite3 *db;
- char *errmsg;
-
- fd = open("log.txt", O_RDWR|O_CREAT|O_APPEND, 0666);
-
- struct sockaddr_in server_addr, client_addr;
- memset(&server_addr, 0, sizeof(server_addr));
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons(2342);
- server_addr.sin_addr.s_addr = inet_addr("192.168.1.165");
- //创建套接字
- sock_fd = socket(AF_INET, SOCK_STREAM, 0);
- if(sock_fd == -1)
- {
- perror("fail socket");
- exit(-1);
- }
- //绑定套接字
- if(bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
- {
- perror("fail bind");
- exit(-1);
- }
- //监听套接字
- if(listen(sock_fd, 4) == -1)
- {
- perror("fail listen");
- exit(-1);
- }
-
- //管理员模式
- pthread_create(&f_pid, NULL, fun_admin_pthread, NULL);
-
-
- //使用并发服务器,可保证多客户端使用
- while(1)
- {
- memset(&user, 0, sizeof(struct message_user));
- addrlen = sizeof(client_addr);
- accept_sock_fd = accept(sock_fd, (struct sockaddr *)&client_addr,(socklen_t *)&addrlen);
- if(accept_sock_fd == -1)
- {
- perror("fail accept");
- exit(-1);
- }
- fun_sockfd = (int *)malloc(sizeof(int));
- *fun_sockfd= accept_sock_fd;
- pthread_create(&pid, NULL, fun_pthread, (void*)fun_sockfd);
-
- }
-
- return 0;
- }
复制代码
所有资料51hei提供下载:
在线词典.rar
(975.63 KB, 下载次数: 17)
|