在线词典的制作

来源:互联网 发布:网络nat穿越 编辑:程序博客网 时间:2024/04/28 23:55

在线词典的功能是用户能够通过自己注册 的账号登陆,查询单词或词组的含义。

项目名称:在线词典

开发环境:linux /C

开发工具:GCC/GDB  SQlite


开发流程:

编译流程:

1.cc load_dict.c  dict.txt  data.deb   -lsqlite3  //注意dict.txt为词典txt文件  ,data.deb为sqlite数据库 

2.cc  sever.c      -lsqlite3

3.cc client.c   -lsqlite3

运行l流程:

1.  ./server  192.168.1.207(server_ip)     8888 (port )  data.deb   

2. ./client    192.168.1.207   8888


调试效果:


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.dbint 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.编写服务端

文件: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;}intexec_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];    intflag = -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.编写客户端

文件: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 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};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;}
注意:以上代码都经作者验证,如有不解或者指正之处请于作者联系,笔者邮箱:755056591@qq.com


原创粉丝点击