本次词典完成下面功能:
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
数据库: