在线词典的功能是用户能够通过自己注册 的账号登陆,查询单词或词组的含义。
项目名称:在线词典
开发环境: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.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.编写服务端
文件: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 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};
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.编写客户端
文件: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;
}
else
printf("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