在线词典的制作

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

项目名称:在线词典

开发环境: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


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值