在线词典的制作
在線(xiàn)詞典的功能是用戶(hù)能夠通過(guò)自己注冊(cè) 的賬號(hào)登陸,查詢(xún)單詞或詞組的含義。
項(xiàng)目名稱(chēng):在線(xiàn)詞典
開(kāi)發(fā)環(huán)境:linux /C
開(kāi)發(fā)工具:GCC/GDB ?SQlite
開(kāi)發(fā)流程:
編譯流程:
1.cc load_dict.c ?dict.txt ?data.deb ? -lsqlite3 ?//注意dict.txt為詞典txt文件 ?,data.deb為sqlite數(shù)據(jù)庫(kù)?
2.cc ?sever.c ? ? ?-lsqlite3
3.cc client.c ? -lsqlite3
運(yùn)行l(wèi)流程:
1. ?./server ?192.168.1.207(server_ip) ? ? 8888 (port?) ?data.deb ??
2. ./client ? ?192.168.1.207 ? 8888
調(diào)試效果:
client界面
server 界面:
1.先錄入詞典
文件:load_dict.c
#include <stdio.h> #include <stdlib.h> #include <sqlite3.h> #include <string.h> #include <errno.h>int exec_sql(sqlite3 *pdb,char *sql) {int ret;char *errmsg;ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg);if(ret != SQLITE_OK){fprintf(stderr,"EXEC %s ERROR : %s.\n",sql,errmsg);return -1;}return 0; }int load_word(FILE *fp,sqlite3 *pdb) {char *pword,*pinfo,*p;char buf[4096];char sql[4096];p = buf;while(fgets(buf,sizeof(buf),fp) != NULL){buf[strlen(buf) - 1] = '\0';while(*p != '\0') {if(*p == '\'')*p = '\"';p ++;}pword = strtok(buf," ");pinfo = buf + strlen(pword) + 1;//鍘繪帀絀烘牸while(*pinfo == ' ')pinfo ++;sprintf(sql,"insert into word_table values('%s','%s');",pword,pinfo);printf("%s %s.\n",pword,pinfo);exec_sql(pdb,sql);} }//./a.out dict.txt dict.db int main(int argc, const char *argv[]) {int ret;sqlite3 *pdb;FILE *fp;if((fp = fopen(argv[1],"r")) == NULL){fprintf(stderr,"Fail to fopen %s:%s.\n",argv[1],strerror(errno));exit(EXIT_FAILURE);}ret = sqlite3_open(argv[2],&pdb);if(ret != SQLITE_OK){fprintf(stderr,"sqlite3 open %s : %s.\n",argv[2],sqlite3_errmsg(pdb));exit(EXIT_FAILURE);}load_word(fp,pdb);exit(EXIT_SUCCESS); }2.編寫(xiě)服務(wù)端
文件:server.c
#include<stdio.h> #include<stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include<string.h> #include<strings.h> #include<sqlite3.h> #include<signal.h>#define _DEBUG_ 0 #define OK 10 #define FAIL 9typedef struct {char _username[10];char _userpassword[10]; }user_t;typedef struct{int type;int errno;union {user_t user_info;char buf[1024];}content;#define user_name content.user_info._username #define pass_word content.user_info._userpassword #define mtxt content.buf}MSG; enum{REGISTER = 1,LOGIN,WORD,QUIT};char name[10] = "note"; char value_buf[1024]; int printf_info(void *addr,int cloumn,char **value,char **name) {int i;int a = 1;for(i = 0 ; i < cloumn; i++){printf("%s\t",name[i]);}putchar('\n');for(i = 0; i < cloumn; i ++ ){printf("%s\t",value[i]);sprintf(value_buf,"%s",value[i]);} // puts("*************print*************");putchar('\n');*((int *)addr) = a;return 0; }int exec_sql(sqlite3 *pdb,char *sql,int *flag) {int ret;char *errmsg;ret = sqlite3_exec(pdb,sql,printf_info,(void *)flag,&errmsg);if(ret != SQLITE_OK){printf("ERROR :%s.\n",errmsg);return -1;}return 0; }int do_regiser(sqlite3 *pdb,MSG *msg) {char sql[1024];int flag = -1;sprintf(sql,"select * from %s where name='%s' and password='%s';",name,msg->user_name,msg->pass_word);exec_sql(pdb,sql,&flag);if(flag > 0 ){// printf("Register fail the usrname is EEXIST!\n");return -1;}sprintf(sql,"insert into %s values('%s' ,'%s');",name,msg->user_name,msg->pass_word);printf("sql :%s\n",sql);if(exec_sql(pdb,sql,&flag) < 0) return -1;return 0; }int do_login(sqlite3 *pdb,MSG *msg) {char sql[1024];int flag = -1;sprintf(sql,"select * from %s where name='%s' and password='%s';",name,msg->user_name,msg->pass_word);exec_sql(pdb,sql,&flag);if(flag > 0)return 0;return -1; }int do_word(sqlite3 *pdb,MSG *msg) {char sql[1024];int flag = -1;sprintf(sql,"select * from %s where word='%s';","dict",msg->mtxt);exec_sql(pdb,sql,&flag);if(flag > 0)return 0;return -1; }int do_task(int type,sqlite3 *pdb,MSG *msg,int connectfd) {switch (type){case REGISTER:msg->errno = OK;if(do_regiser(pdb,msg) < 0)msg->errno = FAIL;send(connectfd,msg,sizeof(MSG),0); break;case LOGIN:msg->errno = OK;if(do_login(pdb,msg) < 0)msg->errno = FAIL;send(connectfd,msg,sizeof(MSG),0); break;case WORD:msg->errno = OK;if(do_word(pdb,msg) < 0) msg->errno = FAIL;strcpy(msg->mtxt,value_buf);send(connectfd,msg,sizeof(MSG),0);break;case QUIT:exit(EXIT_FAILURE);break;default:printf("Unknown cmd\n");break;}return 0; }int display_msg(int type) {switch (type){case REGISTER:printf("REGISTER\n");break;case LOGIN:printf("LOGIN\n");break;case WORD:printf("WORD\n");break;case QUIT:printf("QUIT\n");break;}return 0; }int do_client(int connectfd,sqlite3 *pdb) {int n;char buf;MSG msg;while(1){bzero(&msg,sizeof(MSG));if(( n = recv(connectfd,&msg,sizeof(MSG),0)) < 0){perror("Fail to recv");exit(EXIT_FAILURE);}if(n == 0)exit(EXIT_FAILURE);puts("****************");display_msg(msg.type);puts("****************");do_task(msg.type,pdb,&msg,connectfd);}return 0; }void handle_signal(int signum) {return; }int main(int argc, const char *argv[]) {int listenfd,connectfd;pid_t pid;sqlite3 *pdb;int ret;struct sockaddr_in serversddr,peeraddr;int addrlen;if(signal(SIGCHLD,SIG_IGN) == SIG_ERR){perror("Fail to signal");exit(EXIT_FAILURE);}if((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0){perror("Fail to socket");exit(EXIT_FAILURE);}bzero(&serversddr,sizeof(serversddr));serversddr.sin_family = AF_INET;serversddr.sin_addr.s_addr = inet_addr(argv[1]);serversddr.sin_port = htons(atoi(argv[2]));if(bind(listenfd,(struct sockaddr *)&serversddr,sizeof(serversddr)) < 0){perror("Fail to bind");exit(EXIT_FAILURE);}listen(listenfd,5);printf("listening ...\n");addrlen = sizeof(struct sockaddr);ret = sqlite3_open(argv[3],&pdb);if(ret != SQLITE_OK){printf("Fail to sqlist3_open %s, %s\n",argv[1],sqlite3_errmsg(pdb));exit(EXIT_FAILURE);}while(1){if((connectfd = accept(listenfd, (struct sockaddr *)&peeraddr, &addrlen)) < 0){perror("Fail to accept");exit(EXIT_FAILURE);} puts("**********************************");printf("IP : %s\n",inet_ntoa(peeraddr.sin_addr));printf("PORT : %d\n",ntohs(peeraddr.sin_port));puts("**********************************");if((pid = fork()) < 0){perror("Fail to fork");exit(EXIT_FAILURE);}if(pid == 0){do_client(connectfd,pdb);}close(connectfd);}sqlite3_close(pdb);return 0; }3.編寫(xiě)客戶(hù)端
文件:client.c
#include<stdio.h> #include<stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include<string.h> #include<strings.h> #include<sqlite3.h>#include <sys/types.h> #define OK 10 #define FAIL 9 typedef struct {char _username[10];char _userpassword[10]; }user_t;typedef struct{int type;int errno;union {user_t user_info;char buf[1024];}content;#define user_name content.user_info._username #define pass_word content.user_info._userpassword #define mtxt content.buf}MSG; enum{REGISTER = 1,LOGIN,WORD,QUIT}; int flag_word = REGISTER;int main(int argc, const char *argv[]) {int clientfd,connectfd;MSG msg;int ret,cmd;char buf[1024];sqlite3 *pdb;pid_t pid;struct sockaddr_in serversddr;int addrlen;if((clientfd = socket(AF_INET,SOCK_STREAM,0)) < 0){perror("Fail to socket");exit(EXIT_FAILURE);}bzero(&serversddr,sizeof(serversddr));serversddr.sin_family = AF_INET;serversddr.sin_addr.s_addr = inet_addr(argv[1]);serversddr.sin_port = htons(atoi(argv[2]));addrlen = sizeof(struct sockaddr);ret = sqlite3_open(argv[1],&pdb);if(ret != SQLITE_OK){printf("Fail to sqlist3_open %s, %s\n",argv[1],sqlite3_errmsg(pdb));exit(EXIT_FAILURE);}if(connect(clientfd,(struct sockaddr *)&serversddr,sizeof(struct sockaddr)) < 0){perror("Fail to connect");exit(EXIT_FAILURE);}while(1){puts("***************************************");printf("1.REGISTER 2.LOGIN 3.WORD 4.QUIT\n");puts("***************************************");printf("cmd>");if(scanf("%d",&cmd) != 1){puts("Unknown cmd,Input again");while(getchar() != '\n');continue;}while(getchar() != '\n');switch (cmd){case REGISTER:printf("Input username:");fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] = '\0';strcpy(msg.user_name ,buf);printf("Input userword:");fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] = '\0';strcpy(msg.pass_word ,buf);msg.type = REGISTER;if(send(clientfd,&msg,sizeof(MSG),0) < 0){perror("Fail to sent");exit(EXIT_FAILURE);}bzero(&msg,sizeof(MSG));recv(clientfd,&msg,sizeof(MSG),0);if(msg.errno == OK){printf("REGISTER OK !\n");flag_word = REGISTER;}elseprintf("Register fail the username is EEXIST\n");continue;case LOGIN:printf("Input username:");fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] = '\0';strcpy(msg.user_name ,buf);printf("Input userword:");fgets(buf,sizeof(buf),stdin); buf[strlen(buf) - 1] = '\0';strcpy(msg.pass_word ,buf);msg.type = LOGIN;if(send(clientfd,&msg,sizeof(MSG),0) < 0){perror("Fail to sent");exit(EXIT_FAILURE);}bzero(&msg,sizeof(MSG));recv(clientfd,&msg,sizeof(MSG),0);// printf("msg.errno : %d\n",msg.errno);if(msg.errno == OK){printf("LOGIN SUCCESS!\n");flag_word = LOGIN;goto next;}else printf("Login fail please reegister!\n");continue;next : case WORD:if(flag_word != LOGIN){printf("Please login!\n");continue;}printf("Input WORDS:");fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] = '\0';strcpy(msg.mtxt ,buf);msg.type = WORD;if(send(clientfd,&msg,sizeof(MSG),0) < 0){perror("Fail to sent");exit(EXIT_FAILURE);}bzero(&msg,sizeof(MSG));recv(clientfd,&msg,sizeof(MSG),0);if(msg.errno == OK){printf("SERACH SUCCESS!\n");printf("%s\n",msg.mtxt);}else printf("SERACH FAIL !\n");break;case QUIT:exit(EXIT_SUCCESS);default :printf("Unknown cmd!\n");continue;}}return 0; } 注意:以上代碼都經(jīng)作者驗(yàn)證,如有不解或者指正之處請(qǐng)于作者聯(lián)系,筆者郵箱:755056591@qq.com
總結(jié)
- 上一篇: ASL查找成功和查找失败的计算方法
- 下一篇: 游戏建模怎么学比较好?