|
邏輯清晰,框架規(guī)范的在線電子詞典源程序
C語(yǔ)言源程序如下:
- #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;//跳過第一個(gè)單詞
- }
- 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;
- }
復(fù)制代碼- /*************************************************************************
- > 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>
- //定義用戶數(shù)據(jù)結(jié)構(gòu)體
- 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];//存放查找結(jié)果內(nèi)容的數(shù)組
- char head[6][24]; //存放查找結(jié)果字段名稱的數(shù)組
-
- int state; //用戶在線狀態(tài)
- int nrow; //數(shù)據(jù)庫(kù)函數(shù)執(zhí)行后得到記錄的數(shù)目
- int ncolumn;//數(shù)據(jù)庫(kù)函數(shù)執(zhí)行后得到字段的數(shù)目
-
- int flag; //客戶端發(fā)送的命令
-
- int err; //判斷執(zhí)行數(shù)據(jù)庫(kù)函數(shù)后是否成功
-
- int binary; //判斷查詢歷史記錄的方式,0/姓名,1/單詞
-
- int update; //修改個(gè)人信息選項(xiàng),0/密碼,1/電話,2/地址
- };
- typedef struct message_user Mess_user;
- char buffer1[256]={0};
- int fd;
- time_t timep;
- //使用多線程來實(shí)現(xiàn)并發(fā)服務(wù)器
- 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數(shù)據(jù)庫(kù)
- 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:
- //向數(shù)據(jù)庫(kù)中插入用戶名信息
- 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);//參數(shù)是能返回 time_t 型對(duì)象 的指針 timer ,那里存放著當(dāng)時(shí)時(shí)間。
- strcpy(time_c, ctime(&timep));
- sprintf(buff, "%s用戶%s注冊(cè)\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:
- //開始查找單詞含義,在數(shù)據(jù)庫(kù)中插入查找時(shí)間戳記錄,并把查找結(jié)果發(fā)送給客戶端
- 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:
- //查看個(gè)人信息
- 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查看個(gè)人信息\n", time_c, user.name);
- write(fd, buff, strlen(buff));
-
- }
-
- break;
- case 6:
- //修改個(gè)人信息
- 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修改個(gè)人密碼為%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修改個(gè)人電話為%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修改個(gè)人地址為%s\n", time_c, user.name, user.address);
- write(fd, buff, strlen(buff));
- break;
- }
-
- case 0:
- //關(guān)閉數(shù)據(jù)
- 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("請(qǐng)輸入您要修改的用戶名:");
- 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("沒有此用戶,請(qǐng)更換用戶名\n");
- }
- if(nrow != 0)
- {
- while(1)
- {
- printf("請(qǐng)輸入您要修改的屬性(0/電話,1/地址):");
- scanf("%d",&alter_cmd);
- if(alter_cmd > 1 || alter_cmd < 0)
- {
- printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
- }
- else
- {
- if(alter_cmd == 0)
- {
- printf("請(qǐng)輸入需要更改的新電話號(hào)碼:");
- 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("請(qǐng)輸入需要更改的新地址:");
- 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("請(qǐng)輸入您要添加的用戶名:");
- 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("該用戶已存在,請(qǐng)更換用戶名\n");
- }
- if(nrow == 0)
- {
- printf("請(qǐng)輸入您的密碼:");
- scanf("%s",password);
- printf("請(qǐng)輸入您的電話:");
- scanf("%s",telephone);
- printf("請(qǐng)輸入您的地址:");
- 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("請(qǐng)輸入您要?jiǎng)h除的用戶名:");
- 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("該用戶不存在,請(qǐng)更換用戶名\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;
- }
- }
- }
- }
- //服務(wù)器的管理員模式
- 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("請(qǐng)按A進(jìn)入管理員模式\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("請(qǐng)輸入您要進(jìn)行的操作:");
- scanf("%d",&f_cmd);
- if(f_cmd < 0 || f_cmd > 4)
- {
- printf("輸入有誤,請(qǐng)重新輸入\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("請(qǐng)按回車鍵繼續(xù):");
- 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");
- //創(chuàng)建套接字
- 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);
- }
- //監(jiān)聽套接字
- if(listen(sock_fd, 4) == -1)
- {
- perror("fail listen");
- exit(-1);
- }
-
- //管理員模式
- pthread_create(&f_pid, NULL, fun_admin_pthread, NULL);
-
-
- //使用并發(fā)服務(wù)器,可保證多客戶端使用
- 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;
- }
復(fù)制代碼
所有資料51hei提供下載:
在線詞典.rar
(975.63 KB, 下載次數(shù): 17)
2018-8-26 23:54 上傳
點(diǎn)擊文件名下載附件
在線電子詞典源碼
|
|