在线词典—C语言(无qt界面)

本文介绍了在线词典应用的功能,包括用户注册、登录、密码修改、历史查询和注销,强调了数据库操作和用户验证的安全流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本次词典完成下面功能:

1、用户注册
    判断用户是否注册,若注册就登录,反之须注册 (信息从数据库提取和写入)

2、用户登录
    a.单词查询     (词典单词,返回单词+意思)
    b.历史记录 (单词、时间--月-日-时-分)
    c-更改密码 (登录后,输入新的密码)
    d-退出
    
3、用户注销
    用户名+密码,直接注销(从数据库中删除相应的信息)

4、退出程序

5、连接断开提示
    客户端或者服务器任意一边断开,都会给相应的断开提示;

提供信息:
用户名:xxx
密码:123

1、用户注册

客户端:发送注册命令给服务器。

服务器:服务器将将客户端发来的数据进行处理,提取注用户信息和用户密码,将其存进数据库,若发现用户已经在数据库中,则提示客户端用户已经注册。

演示效果:

注册成功:

账户存在提示:

2、用户登录

客户端:发送注册命令给服务器。

服务器:服务器将将客户端发来的数据进行处理,提取注用户信息和用户密码,将其与数据库里面的账户和密码对比,相同则登录成功,不同则提示错误。

 登录成功实现四个 功能:

1-查词典  2-历史   3-更改密码:  4-退出\n

查词典:

 历史记录:

 更改密码:

 3、用户注销:

 

 客户端代码:

#include <stdio.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>

#include <arpa/inet.h>
#include <string.h>
#include "comm.h"
#include <sqlite3.h> 

#define SERV_PORT 9527 //端口号

//窗口界面
int menuShow(void)
{
	int select;
	printf("/******************************************/\n\n");
	printf("\t欢迎使用在线词典--版本号:1.0\n\n");
	printf("/******************************************/\n\n");

	printf("请进行如下选择:\n\n\t1.用户注册\n\n\t2.用户登录\n\n\t3.账户注销\n\n\t4.退出\n\n");
	printf("请选择:");
	scanf("%d",&select);
	return select;
}


//查词典
int do_search_dic(int socket_cli){
	int ret;
	int socket_ser = socket_cli;
	struct msg_struct msg;
loop:
	memset(&msg,0,sizeof(msg));
	printf("请输入单词(输入#结束查询):\n");
	scanf("%s",msg.word);
	if(strcmp(msg.word,"#") == 0){
		return -23;
	}
	msg.cmd=5;
	ret = send(socket_ser,&msg,sizeof(msg),0);
	if(ret<0){
		perror("send err");
		return -34;
	}
	
	//服务器回应
	struct msg_struct recv_msg;
	memset(&recv_msg,0,sizeof(recv_msg));
	ret = recv(socket_cli,&recv_msg,sizeof(recv_msg),0);
	if(ret<0){
		perror("register recv err");
		return -34;
	}else if(ret==0){
		printf("服务器关闭!\n");
		return 0;
	}
	
	if(recv_msg.cmd==12){
		if(recv_msg.ret==0){
			printf("\n");
			printf("%s\n",recv_msg.response);
			printf("%s\n",recv_msg.word_mean);

		}
		if(recv_msg.ret==34){
			printf("%s\n",recv_msg.response);
		}
goto loop;
	}
	
	
}

//查询历史记录
int do_search_history_memory(int socket_cli)
{
	struct msg_struct msg;
	memset(&msg,0,sizeof(msg));
	
	msg.cmd=6;
	
	int ret = send( socket_cli,&msg,sizeof(msg),0);
	if(ret<0){
		perror("send err");
		return -34;
	}
	
	
	//服务器回应
	struct msg_history recv_msg;
	memset(&recv_msg,0,sizeof(recv_msg));
	ret = recv(socket_cli,&recv_msg,sizeof(recv_msg),0);
	if(ret<0){
		perror("register recv err");
		return -34;
	}else if(ret==0){
		printf("查询历史记录发现服务器关闭!\n");
		return 0;
	}
	
	
	int nrow = recv_msg.nrow;
	int ncolumn=recv_msg.ncolumn;
	printf("历史记录如下:\n");
	
	for(int i=0;i<(nrow+1)*ncolumn;i++){
		printf("%-16s",recv_msg.tt[i]);	   			
		if( ( (i+1) %  ncolumn ) ==0  ){
			printf("\n");
		}
	}
	
}

//修改密码
int do_update_password(int socket_cli){
	
	int socket_ser = socket_cli;
	struct msg_struct msg;
	
	memset(&msg,0,sizeof(msg));
	printf("请输入账户名:\n");
	scanf("%s",msg.name);
	printf("请输入新的密码:\n");
	scanf("%s",msg.new_passwd);
	msg.cmd=4;
	
	int ret = send(socket_ser,&msg,sizeof(msg),0);
	if(ret<0){
		perror("uptate send err");
		return -34;
	}
	
	//服务器回应
	struct msg_struct recv_msg;
	memset(&recv_msg,0,sizeof(recv_msg));
	ret = recv(socket_cli,&recv_msg,sizeof(recv_msg),0);
	if(ret<0){
		perror("register recv err");
		return -34;
	}else if(ret==0){
		printf("改密码时发现服务器关闭!\n");
		return 0;
	}
	
	if(recv_msg.cmd==12){
		if(recv_msg.ret==0){
			printf("%s\n",recv_msg.response);
		}
		if(recv_msg.ret==34){
			printf("%s\n",recv_msg.response);
		}
	}
	return 0;
}
//注册
int do_register(int socket_cli){
	
	int socket_ser = socket_cli;
	struct msg_struct msg;
	
	memset(&msg,0,sizeof(msg));
	printf("请输入注册账户名:\n");
	scanf("%s",msg.name);
	printf("请输入注册密码:\n");
	scanf("%s",msg. passwd);
	msg.cmd=1;
	
	//printf("%s->%d\n",__func__,__LINE__);
	
	int ret = send(socket_ser,&msg,sizeof(msg),0);
	if(ret<0){
		perror("send err");
		return -34;
	}
	
	//printf("%s->%d\n",__func__,__LINE__);

	//服务器回应
	struct msg_struct recv_msg;
	memset(&recv_msg,0,sizeof(recv_msg));
	ret = recv(socket_cli,&recv_msg,sizeof(recv_msg),0);
	if(ret<0){
		perror("register recv err");
		return -34;
	}else if(ret==0){
		printf("注册时发现服务器关闭!\n");
		return 0;
	}
	
	//printf("%d\n",recv_msg.cmd);
	//printf("%d\n",recv_msg.ret);
	
	if(recv_msg.cmd==12){
		if(recv_msg.ret==0){
			printf("%s\n",recv_msg.response);
		}
		if(recv_msg.ret==34){
			printf("%s\n",recv_msg.response);
		}
	}
}

//登录
int do_loged(int socket_cli)
{

	struct msg_struct msg;
	memset(&msg,0,sizeof(msg));
	printf("请输入账户名:\n");
	scanf("%s",msg.name);
	printf("请输入密码:\n");
	scanf("%s",msg.passwd);
	msg.cmd=2;
	
	//printf("%s->%d\n",__func__,__LINE__);
	
	int ret = send(socket_cli,&msg,sizeof(msg),0);
	if(ret<0){
		perror("send err");
		return -34;
	}
	
	//printf("%s->%d\n",__func__,__LINE__);
	
	//服务器回应
	memset(&msg,0,sizeof(msg));
	ret = recv(socket_cli,&msg,sizeof(msg),0);
	if(ret<0){
		perror("register recv err");
		return -34;
	}else if(ret==0){
		printf("注册时发现服务器关闭!\n");
		return 0;
	}
	
	if(msg.cmd==12){
		if(msg.ret==0){
			printf("%s\n",msg.response);
			 int select;
			 printf("请选择--> 1-查词典  2-历史   3-更改密码:  4-退出\n");
			 scanf("%d",&select); 
			 switch(select){
			 case 1:
				do_search_dic(socket_cli); //查词典
				break;
			 case 2:
				do_search_history_memory(socket_cli); //查历史记录
				break;
			 case 3:
				do_update_password(socket_cli); 
				break;
			 case 4:
				exit(0);
				break;	 
			 }
		}
		if(msg.ret==34){
			printf("%s\n",msg.response);
		}
	}
}
//账户注销
int do_logout(int socket_cli){
	
	int socket_ser = socket_cli;
	struct msg_struct msg;
	
	memset(&msg,0,sizeof(msg));
	printf("请输入注销账户名:\n");
	scanf("%s",msg.name);
	printf("请输入注销密码:\n");
	scanf("%s",msg.passwd);
	msg.cmd=3;
	
	//printf("%s->%d\n",__func__,__LINE__);
	
	int ret = send(socket_ser,&msg,sizeof(msg),0);
	if(ret<0){
		perror("send err");
		return -34;
	}
	
	//printf("%s->%d\n",__func__,__LINE__);


	//服务器回应
	struct msg_struct recv_msg;
	memset(&recv_msg,0,sizeof(recv_msg));
	ret = recv(socket_cli,&recv_msg,sizeof(recv_msg),0);
	if(ret<0){
		perror("register recv err");
		return -34;
	}else if(ret==0){
		printf("注销时发现服务器关闭!\n");
		return 0;
	}
	
	//printf("%d\n",recv_msg.cmd);
	//printf("%d\n",recv_msg.ret);
	
	if(recv_msg.cmd==12){
		if(recv_msg.ret==0){
			printf("%s\n",recv_msg.response);
		}
		if(recv_msg.ret==34){
			printf("%s\n",recv_msg.response);
		}
	}
}

int main()
{
	int socket_cli = socket(AF_INET,SOCK_STREAM, 0 );
	if(socket_cli <0){
		perror("create client socket err");
		return -3;
	}
	
	struct sockaddr_in  serv_addr;
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons(SERV_PORT); 
	serv_addr.sin_addr.s_addr = INADDR_ANY; //自动获取ip
	int ret = connect(socket_cli,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
	if(ret <0){
		perror("connect err");
		return -3;
	} 

	while(1){
		int select;
		select=menuShow();
		switch(select){
		case 1:
			do_register(socket_cli);	//注册
			break;
		case 2:
			do_loged(socket_cli);   //登录
			break;
		case 3:
			do_logout(socket_cli);  //注销
			break;
		case 4:
			exit(0);   //退出
			break;
		}
	
	return 0;
	}
}

服务器代码:

#include <stdio.h>	 
#include <sys/types.h>          
#include <sys/socket.h>

#include <netinet/in.h>
#include <netinet/ip.h>

#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include "comm.h"
#include <sqlite3.h> 
#include <time.h>

#define SERV_PORT 9527  //定义一个宏


struct thread_msg {
	int cli_socket;
	pthread_t tid;
	
};
//注册
int do_serv_register(int socket,struct msg_struct *ptmsg){
	
	//打开数据库
	sqlite3 *db; //定义可访问数据库的描述符,后面可直接用该描述符直接访问数据库
	int ret = sqlite3_open("./message.db", &db );
	if(ret){
		printf("sqlite open err:%s\n",  sqlite3_errmsg(db) );
		return -34;
	}
	
	struct msg_struct *msg=ptmsg;
	char sqlbuf[128]={0};
	snprintf(sqlbuf,sizeof(sqlbuf),"select * from user where name=\'%s\'",msg->name);
	char *sql = sqlbuf;//把sql语句加入数组
	
	char **pt = NULL; 
	int nrow,ncolumn; //行列
	ret = sqlite3_get_table(db,sql,&pt, &nrow, &ncolumn, NULL); 
	if(ret){
		printf("sqlite gettable err:%s\n",sqlite3_errmsg(db));
		return -34;
	}
	//注册
	if(nrow==0){  //账户不存在,进行注册
		memset(sqlbuf,0,sizeof(sqlbuf));
		snprintf(sqlbuf,sizeof(sqlbuf),"insert into user (name,password) values (\'%s\',\'%s\');",msg->name,msg->passwd);
		ret = sqlite3_get_table(db,sql,&pt, &nrow, &ncolumn, NULL); 
		if(ret){
			printf("sqlite gettable err:%s\n",sqlite3_errmsg(db));
			return -34;
		}
		printf("add user_msg success!\n");
		
		struct msg_struct sendmsg;
		memset(&sendmsg,0,sizeof(sendmsg));
		sendmsg.cmd=12;
		sendmsg.ret = 0;
		strcpy(sendmsg.response ,"恭喜您,注册成功!");
		int ret = send(socket,&sendmsg,sizeof(sendmsg),0);
		if(ret<0){
			perror("register send err");
			return -34;
		}
		ret = sqlite3_close(db);//关闭数据库
	}
	
	else{  //账户存在,注册不了
		struct msg_struct sendmsg;
		memset(&sendmsg,0,sizeof(sendmsg));
		sendmsg.cmd=12; //服务器应答
		sendmsg.ret=34; //非零的值
		strcpy(sendmsg.response ,"对不起,您注册的账户已经存在,请直接登录!");
		int ret = send(socket,&sendmsg,sizeof(sendmsg),0);
		if(ret<0){
			perror("register send err");
			return -34;
		}
		ret = sqlite3_close(db);//关闭数据库
	}
	
	
}

//登录
int do_serv_loged(int socket,struct msg_struct *ptmsg){
	
	//打开数据库
	sqlite3 *db;
	int ret = sqlite3_open("./message.db", &db );
	if(ret){
		printf("sqlite open err:%s\n",  sqlite3_errmsg(db) );
		return -34;
	}
	
	struct msg_struct *msg=ptmsg;
	char sqlbuf[128]={0};
	snprintf(sqlbuf,sizeof(sqlbuf),"select * from user where (name=\'%s\' and  password=\'%s\');",msg->name,msg->passwd);
	char *sql = sqlbuf;//把sql语句加入数组

	char **pt = NULL; 
	int nrow,ncolumn; //行列
	ret = sqlite3_get_table(db,sql,&pt, &nrow, &ncolumn, NULL); 
	if(ret){
		printf("sqlite gettable err:%s\n",sqlite3_errmsg(db));
		return -34;
	}
	if(nrow != 0 ){
		struct msg_struct sendmsg;
		memset(&sendmsg,0,sizeof(sendmsg));
		sendmsg.cmd=12;
		sendmsg.ret = 0;
		strcpy(sendmsg.response ,"登录成功!");
		int ret = send(socket,&sendmsg,sizeof(sendmsg),0);
		if(ret<0){
			perror("register send err");
			return -34;
		}
		ret = sqlite3_close(db);//关闭数据库
	}
	else{  //账户存在,注册不了
		struct msg_struct sendmsg;
		memset(&sendmsg,0,sizeof(sendmsg));
		sendmsg.cmd=12; //服务器应答
		sendmsg.ret=34; //非零的值
		strcpy(sendmsg.response ,"账户或密码错误,请检查后重新登录!");
		int ret = send(socket,&sendmsg,sizeof(sendmsg),0);
		if(ret<0){
			perror("register send err");
			return -34;
		}
		ret = sqlite3_close(db);//关闭数据库
	}
}
//查词典
int do_serv_find_dict_words(int socket,struct msg_struct *ptmsg){
	
	//获取时间
	time_t sec,xsec;
	sec = time(NULL);//sec = time(&xsec);
	struct tm *ptm = localtime(&sec);
	//printf("%04d-%02d-%02d %d:%d:%d\n",\
		ptm->tm_year+1900,ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
	char buf[256];
	snprintf(buf,sizeof(buf),"%02d-%02d %d:%d",ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min);
	//printf("%s",buf);
	
	
	
	
	//打开数据库
	sqlite3 *db;
	int ret = sqlite3_open("./message.db", &db );
	if(ret){
		printf("sqlite open err:%s\n",  sqlite3_errmsg(db) );
		return -34;
	}
	
	
	
	
	
	struct msg_struct *msg=ptmsg;
	char sqlbuf[128]={0};
	snprintf(sqlbuf,sizeof(sqlbuf),"insert into history(word,time) values (\'%s\',\'%s\');",msg->word,buf);
	char *sql = sqlbuf;//把sql语句加入数组
	
	char **pt = NULL; 
	int nrow,ncolumn; //行列
	ret = sqlite3_get_table(db,sql,&pt, &nrow, &ncolumn, NULL); 
	if(ret){
		printf("sqlite gettable err:%s\n",sqlite3_errmsg(db));
		return -34;
	}
	
	
	
	//打开文件fopen,查单词
	FILE *fp=NULL;
	fp = fopen("./dict.txt","r+");
	if(!fp){
		printf("fopen err\n");
		return -34;
	}
	printf("fopen success\n");
	while(1){
		struct msg_struct means;
		memset(&means,0,sizeof(means));
		char *s = fgets(means.word_mean,sizeof(means.word_mean),fp);
		if(s==NULL){
			printf("find end of file\n");
			return -3;
		}
		char wordbuf[64];
		memset(&wordbuf,0,sizeof(wordbuf));
		for(int i=0; means.word_mean[i] != ' '; i++)
		{
			wordbuf[i]=means.word_mean[i];
		}
	
		if(strcmp(ptmsg->word,wordbuf) == 0){
			printf("%s\n",wordbuf);
			//发给客户端
			struct msg_struct sendmsg;
			memset(&sendmsg,0,sizeof(sendmsg));
			stpcpy(sendmsg.word_mean,means.word_mean);
			sendmsg.cmd=12;
			sendmsg.ret = 0;
			strcpy(sendmsg.response ,"查询结果如下:");
			int ret = send(socket,&sendmsg,sizeof(sendmsg),0);
			if(ret<0){
				perror("find send err");
				return -34;
			}
			break;
		}
		
		/*
		if(strcmp(ptmsg->word,wordbuf) != 0)
		{
			struct msg_struct sendmsg;
			memset(&sendmsg,0,sizeof(sendmsg));
			sendmsg.cmd=12; //服务器应答
			sendmsg.ret=34; //非零的值
			strcpy(sendmsg.response ,"该单词不存在,词库没有收录!");
			int ret = send(socket,&sendmsg,sizeof(sendmsg),0);
			if(ret<0){
				perror("find1 send err");
				return -34;
			}
			break;
		}
		*/
	}
	
}

//查历史记录
int do_serv_find_history_words(int socket,struct msg_struct *ptmsg){
	
	//打开数据库
	sqlite3 *db;
	struct msg_history his_msg;
	memset(&his_msg,0,sizeof(his_msg));
	
	int ret = sqlite3_open("./message.db", &db );
	if(ret){
		printf("sqlite open err:%s\n",  sqlite3_errmsg(db) );
		return -34;
	}
	
	struct msg_struct *msg=ptmsg;
	char sqlbuf[128]={0};
	snprintf(sqlbuf,sizeof(sqlbuf),"select * from history;");
	char *sql = sqlbuf;//把sql语句加入数组

	char **pt = NULL; 
	int nrow,ncolumn; //行列
	ret = sqlite3_get_table(db,sql,&pt, &nrow, &ncolumn, NULL); 
	if(ret){
		printf("sqlite gettable err:%s\n",sqlite3_errmsg(db));
		return -34;
	}
	
	
	his_msg.nrow=nrow;
	his_msg.ncolumn=ncolumn;
	
	
	
	printf("222\n");
	for(int i=0;i<(nrow+1)*ncolumn;i++){
		//printf("%-16s",pt[i]);	
		strcpy(his_msg.tt[i],pt[i]);
	}
	printf("111\n");
	ret = send(socket,&his_msg,sizeof(his_msg),0);
		if(ret<0){
			perror("register send err");
			return -34;
		}
	
	sqlite3_close(db);//关闭数据库
	
}
//修改密码
int do_serv_update_password(int socket,struct msg_struct *ptmsg){
	//打开数据库
	sqlite3 *db;
	int ret = sqlite3_open("./message.db", &db );
	if(ret){
		printf("sqlite open err:%s\n",  sqlite3_errmsg(db) );
		return -34;
	}
	
	struct msg_struct *msg=ptmsg;
	char sqlbuf[128]={0};
	snprintf(sqlbuf,sizeof(sqlbuf),"select * from user where name=\'%s\';",msg->name);
	char *sql = sqlbuf;//把sql语句加入数组

	char **pt = NULL; 
	int nrow,ncolumn; //行列
	ret = sqlite3_get_table(db,sql,&pt, &nrow, &ncolumn, NULL); 
	if(ret){
		printf("sqlite gettable err:%s\n",sqlite3_errmsg(db));
		return -34;
	}
	
	if(nrow != 0 ){
		memset(sqlbuf,0,sizeof(sqlbuf));
		snprintf(sqlbuf,sizeof(sqlbuf),"update user set password=\'%s\' where name=\'%s\';",msg->new_passwd,msg->name);
		ret = sqlite3_get_table(db,sql,&pt, &nrow, &ncolumn, NULL); 
		if(ret){
		printf("sqlite gettable err:%s\n",sqlite3_errmsg(db));
		return -34;
		
		}
		struct msg_struct sendmsg;
		memset(&sendmsg,0,sizeof(sendmsg));
		sendmsg.cmd=12;
		sendmsg.ret = 0;
		strcpy(sendmsg.response ,"密码修改成功!");
		int ret = send(socket,&sendmsg,sizeof(sendmsg),0);
		if(ret<0){
			perror("register send err");
			return -34;
		}
		ret = sqlite3_close(db);//关闭数据库
		
	}
	else{  //失败
		struct msg_struct sendmsg;
		memset(&sendmsg,0,sizeof(sendmsg));
		sendmsg.cmd=12; //服务器应答
		sendmsg.ret=34; //非零的值
		strcpy(sendmsg.response ,"修改失败!");
		int ret = send(socket,&sendmsg,sizeof(sendmsg),0);
		if(ret<0){
			perror("register send err");
			return -34;
		}
		ret = sqlite3_close(db);//关闭数据库
	}
	
	
}
//注销
int do_serv_logout(int socket,struct msg_struct *ptmsg){
	//打开数据库
	sqlite3 *db;
	int ret = sqlite3_open("./message.db", &db );
	if(ret){
		printf("sqlite open err:%s\n",  sqlite3_errmsg(db) );
		return -34;
	}
	
	struct msg_struct *msg=ptmsg;
	char sqlbuf[128]={0};
	snprintf(sqlbuf,sizeof(sqlbuf),"select * from user where name=\'%s\' and  password=\'%s\';",msg->name,msg->passwd);
	char *sql = sqlbuf;//把sql语句加入数组

	char **pt = NULL; 
	int nrow,ncolumn; //行列
	ret = sqlite3_get_table(db,sql,&pt, &nrow, &ncolumn, NULL); 
	if(ret){
		printf("sqlite gettable err:%s\n",sqlite3_errmsg(db));
		return -34;
	}
	if(nrow != 0 ){
		memset(sqlbuf,0,sizeof(sqlbuf));
		snprintf(sqlbuf,sizeof(sqlbuf),"delete from user where name=\'%s\' and  password=\'%s\';",msg->name,msg->passwd);
		ret = sqlite3_get_table(db,sql,&pt, &nrow, &ncolumn, NULL); 
		if(ret){
		printf("sqlite gettable err:%s\n",sqlite3_errmsg(db));
		return -34;
		}
		struct msg_struct sendmsg;
		memset(&sendmsg,0,sizeof(sendmsg));
		sendmsg.cmd=12;
		sendmsg.ret = 0;
		strcpy(sendmsg.response ,"注销成功!");
		int ret = send(socket,&sendmsg,sizeof(sendmsg),0);
		if(ret<0){
			perror("register send err");
			return -34;
		}
		ret = sqlite3_close(db);//关闭数据库
		
	}
	else{  //注销失败
		struct msg_struct sendmsg;
		memset(&sendmsg,0,sizeof(sendmsg));
		sendmsg.cmd=12; //服务器应答
		sendmsg.ret=34; //非零的值
		strcpy(sendmsg.response ,"账户或密码错误,注销失败!");
		int ret = send(socket,&sendmsg,sizeof(sendmsg),0);
		if(ret<0){
			perror("register send err");
			return -34;
		}
		ret = sqlite3_close(db);//关闭数据库
	}
	
}


//接受客户端请求并处理
void *serv_for_client(void *args)
{
	struct thread_msg *pmsg = args;
	int socket = pmsg->cli_socket;
	
	//处理客户端的登录请求
	struct msg_struct serv_msg;
	int ret;
	while(1){
		memset(&serv_msg,0,sizeof(serv_msg));
		ret = recv(socket,&serv_msg,sizeof(serv_msg),0);
		if(ret<0){
			perror("loged_ser recv err");
			return NULL;
		}else if(ret==0){
			printf("登录时发现客户端关闭!\n");
			return 0;
		}
		
		//对客户端发送来的命令进行处理
		
		//printf("recv cli cmd = %d\n",serv_msg.cmd);
		
		switch(serv_msg.cmd){
		case 1:   //register(注册)	
			do_serv_register(socket,&serv_msg);
			break;
		case 2:   //loged(d登录)
			do_serv_loged(socket,&serv_msg);
			break;
		case 3: //注销
			do_serv_logout(socket,&serv_msg);
			break;
		case 4: //更改密码
			do_serv_update_password(socket,&serv_msg);
			break;
		case 5:  //查词典
			do_serv_find_dict_words(socket,&serv_msg);
			break;
		case 6:
			do_serv_find_history_words(socket,&serv_msg);
			break;
		}
		
	}
	
	close(socket);
	return NULL;
}

int main()
{
	int socket_main = socket(AF_INET,SOCK_STREAM,0);
	if(socket_main<0)
	{
		printf("socket_main error");
		return -34;
	}
	struct sockaddr_in  ser_addr;
	ser_addr.sin_family=AF_INET;	
	ser_addr.sin_port=htons( SERV_PORT); 
	ser_addr.sin_addr.s_addr =INADDR_ANY; //自动获取任意可用的ip地址
	 
	 // 允许复用本地地址和端口号
	int enable = 1;
	setsockopt(socket_main,SOL_SOCKET,SO_REUSEADDR,&enable,sizeof(enable));

	//绑定
	int ret=bind(socket_main,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
	ret = listen(socket_main,5);//一般选5,表示可以同时处理2*5+1
	if(ret<0){
		perror("listen err");
		return -3;
	}
	struct sockaddr_in cli_addr; 
	socklen_t addrlen=sizeof(cli_addr); 
	
	struct thread_msg *pmsg  =NULL;
	int socket_new;
loop:	
	socket_new = accept(socket_main ,(struct sockaddr *)&cli_addr, &addrlen);
	if(socket_new<0){
		perror("accept err");
		return -3;
	}
	printf("serv accept client ip=%s port=%d\n",\
			inet_ntoa (cli_addr.sin_addr  ),  ntohs(cli_addr.sin_port)  );
	pmsg = malloc(sizeof(*pmsg)); //分配空间
	pmsg->cli_socket=socket_new;
	pthread_create(&pmsg->tid,NULL, serv_for_client , pmsg);
	goto loop; //处理完毕一个连接,然后继续去等待新客户端
	
	close(socket_main);  //关闭
	return 0;
}

共享头文件:
 

#ifndef  _DIC_H

#define  _DIC_H





struct msg_struct{

	char cmd;		//1-register  2-log    3-logout   4-修改密码   //6-历史记录   12.服务器应答   

	char dic_cmd;   // 1-dicfind   5-history   6-passwd 

	char name[32];

	char passwd[16];

	char new_passwd[16];

	

	char word[64];  

	

	char word_mean[1024];

	

	//服务器的回应

	char ret;  //0-success  errno-失败原理

	char response[128];

};



struct msg_history{

	

	char memory_word[32];   //历史单词

	char daytime[32];       //历史时间

	int nrow;

	int ncolumn;

	char tt[1024][64];

	

};



#endif

数据库:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值