服务器
#include <head.h>
//函数头
void Storage(sqlite3* db,sqlite3* user_db);
//菜单的函数头
void mume(sqlite3* db,sqlite3* user_db);
//退出循环所用
void Drop_out(sqlite3* db,sqlite3* user_db);
//tcp网络初始化
int Link_inet();
//线程退出函数
void *Pth_drop_out(void *arg);
//线程连接后工作函数
void *Pth_tcp_work(void *arg);
//回调函数
int callback_login(void *arg, int columns, char **column_text, char **column_name);
//回调函数的展示
int callback_show(void *arg, int columns, char **column_text, char **column_name);
//查找英文注解的回调函数
int callback_find(void *arg, int columns, char **column_text, char **column_name);
//TCP的IP头和PORT
#define IP "192.168.0.226"
//#define IP "192.168.71.244"
#define PROT 5665
//打开数据库并存储字典信息
sqlite3* db;
sqlite3* user_db;
sqlite3* use_db;
//判断进行了什么错误的函数
int res_worng;
char chinese[64];
char english[32];
//判断错误
#define ERR_MSG(msg) do{\
fprintf(stderr,"line: %d\n",__LINE__);\
perror(msg);\
}while(0);
int main(int argc,const char * argv[])
{
//初始化字典并等待程序响应
printf("字典初始化中...\n");
printf("人员管理系统启动中...\n");
printf("请稍后\n");
Storage(db,user_db);
//此时创建一个线程负责服务器的关闭
pthread_t tid;
if((pthread_create(&tid,NULL,(void *)Pth_drop_out,NULL)) < 0)
{
printf("__%d__ pthread error\n",__LINE__);
return -1;
}
//分离线程让内核回收
pthread_detach(tid);
//初始话网络连接
printf("初始化tcp网络...\n");
printf("请稍后\n");
int sfd = Link_inet();
//文件相关
int newfd;
struct sockaddr_in sin;
socklen_t len = sizeof(sin);
while(1)
{
newfd = accept(sfd,(struct sockaddr*)&sin,&len);
if(newfd < 0)
{
ERR_MSG("accept");
return -1;
}
printf("accept success\n");
if((pthread_create(&tid,NULL,(void *)Pth_tcp_work,(void*)&newfd)) < 0)
{
printf("__%d__ pthread error\n",__LINE__);
return -1;
}
//分离线程让内核回收
pthread_detach(tid);
}
return 0;
}
//目录
void mume(sqlite3* db,sqlite3* user_db)
{
int a;
while(1)
{
//system("clear");
// printf("\t************************************\n");
// printf("\t************************************\n");
printf("\t************************************\n");
printf("\t***************1.退出***************\n");
printf("\t************************************\n");
// printf("\t************************************\n");
// printf("\t************************************\n");
printf("请输入1退出\n");
scanf("%d",&a);
getchar();
switch(a)
{
case 1:
//退出词典程序删除
Drop_out(db,user_db);
break;
case 2:
//登录上词典程序
break;
case 3:
//注册词典程序
break;
default:
printf("输入有误请重新输入\n");
getchar();
}
printf("请输入enter键清空\n");
getchar();
}
}
//打开数据库并存储信息
void Storage(sqlite3* db,sqlite3* user_db)
{
//打开字典数据库和用户数据库
if((sqlite3_open("./dict.db",&db)) != 0)
{
printf("sqlite3_open error %d\n",sqlite3_errcode(db));
//return NULL;
}
//printf("__%d__\n",__LINE__);
printf("sqlites_dict_open success\n");
if((sqlite3_open("./user.db",&user_db)) != 0)
{
printf("sqlite3_open error %d\n",sqlite3_errcode(user_db));
//return NULL;
}
if((sqlite3_open("./use.db",&use_db)) != 0)
{
printf("sqlite3_open error %d\n",sqlite3_errcode(use_db));
//return NULL;
}
//printf("__%d__\n",__LINE__);
printf("sqlites_user_open success\n");
char str1[128] ="create table if not exists dict (world char,translate char);";
char *errmsg;
//创建数据库并存储信息
if((sqlite3_exec(db,str1,NULL,NULL,&errmsg)) != 0)
{
printf(" __%d__sqlites:%d\n",__LINE__,*errmsg);
}
printf("open_dict success\n");
// memset(errmsg,0,sizeof(errmsg));
memset(str1,0,sizeof(str1));
strcpy(str1,"create table if not exists user (user char PRIMARY KEY,password char,online int);");
//创建数据库并存储信息
//printf("__%d__\n",__LINE__);
if((sqlite3_exec(user_db,str1,NULL,NULL,&errmsg)) != 0)
{
printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
}
printf("open_user success\n");
memset(str1,0,sizeof(str1));
strcpy(str1,"create table if not exists user_history (user char,english char,chinese char,time char);");
//创建数据库并存储信息
//printf("__%d__\n",__LINE__);
if((sqlite3_exec(use_db,str1,NULL,NULL,&errmsg)) != 0)
{
printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
}
printf("open_user success\n");
FILE* fd;
//打开单词表
fd = fopen("./dict.txt","r+");
if(fd < 0)
{
ERR_MSG("fopen");
//return NULL;
}
printf("fopen success\n");
char buf[128] = "";
char str[128] = "";
int i = 0;
//存储单词进数据库
while(1)
{
memset(str,0,sizeof(str));
if((fgets(str,sizeof(str),fd)) ==NULL)
{
break;
}
str[strlen(str)-1]=' ';
// printf("__%d__\n",__LINE__);
for( i = 0; i < strlen(str);i++)
{
if(str[i] ==' '&&str[i+1] ==' '&&(str[i-1] >= 'a'||str[i-1] <= 'z'))
{
//储存进电子词典内
*(str + i)='\0';
sprintf(str1,"insert into dict values (\"%s\",\"%s\");",str,str+i+3);
if((sqlite3_exec(db,str1,NULL,NULL,&errmsg)) != 0)
{
printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
}
break;
}
}
}
memset(str1,0,sizeof(str1));
sprintf(str1,"insert into user values (\"asd\",\"123\",0);");
if((sqlite3_exec(user_db,str1,NULL,NULL,&errmsg)) != 0)
{
printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
}
//printf("%s\n",str1);
printf("用户表的初始化完成\n");
printf("字典初始化完成\n");
fclose(fd);
}
//退出关闭所有的数据库和所有的文件
void Drop_out(sqlite3* db,sqlite3* user_db)
{
char str1[128] = "";
char *errmsg;
//关闭词典数据库并删掉此数据库
system("rm dict.db");
printf("delet dict success");
system("rm user.db");
printf("delet user success");
system("rm use.db");
printf("delet use success");
for(int i = 0; i < 1024; i++)
{
close(i);
}
printf("所有文件关闭成功\n");
exit(0);
}
//TCP网络的启动
int Link_inet()
{
//创建流式字节套
int sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd < 0)
{
ERR_MSG("socket");
return -1;
}
//允许端口快速被使用
int reuse = 1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0){
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速被启用成功\n");
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = ntohs(PROT);
sin.sin_addr.s_addr = inet_addr(IP);
//绑定
if((bind(sfd,(struct sockaddr*)&sin,sizeof(sin))) < 0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success\n");
//监听
if((listen(sfd,128)) < 0)
{
ERR_MSG("bind");
return -1;
}
printf("listen success\n");
return sfd;
}
//菜单的使用
void *Pth_drop_out(void *arg)
{
mume(db,user_db);
}
//创建线程2的使用
void *Pth_tcp_work(void *arg)
{
//服务器和客户端的所有交流的对应的newfd
int ress = 0,resv = 0,res = 0;
int newfd = *(int *)arg;
char buff[128] = "";
char username[20]="";
char *errmsg;
//打开用户的数据库
if((sqlite3_open("./user.db",&user_db)) != 0)
{
printf("sqlite3_open error %d\n",sqlite3_errcode(user_db));
}
//打开字典数据库
if((sqlite3_open("./dict.db",&db)) != 0)
{
printf("sqlite3_open error %d\n",sqlite3_errcode(db));
}
while(1)
{
//登录 L/l 注册 R/r 查询 S/s 查询历史 H/h
//阻塞等待接收信息
memset(buff,0,sizeof(buff));
resv = recv(newfd,buff,sizeof(buff),0);
if(resv < 0)
{
break;
}
if('R' == buff[0]||'r' == buff[0])
{
//注册循环接收信息并发送ask包或者是error
char str[128] = "";
char sql[128]= "";
int i = 0;
//printf("__%d__\n",__LINE__);
printf("%s\n",buff+1);
//printf("__%d__\n",__LINE__);
strcpy(str,buff+1);
//printf("__%d__\n",__LINE__);
for(i = 0; i < strlen(str);i++)//客户端需要fgets接收字符串
{
//确定str的字符串位置
if( (' ' == *(str+i))&&(' ' == *(str+i+1)))
{
*(str+i) = '\0';
//写入sql中
printf("%d\n",i);
//printf("__LINE%d__%s %s\n",__LINE__,str,str+i+2);
//memset(&errmsg,0,sizeof(errmsg));
sprintf(sql,"insert into user values (\"%s\",\"%s\",0);",str,str+i+2);
//printf("%s\n",sql);
if((sqlite3_exec(user_db,sql,NULL,NULL,&errmsg)) != 0)
{
printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
//printf("__%d__\n",__LINE__);
memset(buff,0,sizeof(buff));
buff[0] = 'W';
strcpy(buff+1,"USER IS EXIST");
ress = send(newfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("recv");
return NULL;
}
continue;
}
else
{
memset(buff,0,sizeof(buff));
buff[0] = 'A';
strcpy(buff+1,"Successful insertion");
ress = send(newfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("recv");
return NULL;
}
break;
}
}
}
}
//登录
else if('L' == buff[0]||'l' == buff[0])
{
//登录循环接收信息并发送ask包或者是error
res_worng = -1;
char str[128] = "";
char sql[128]= "";
int res = 0;
int i = 0;
//printf("__%d__\n",__LINE__);
//printf("%s\n",buff+1);
//printf("__%d__\n",__LINE__);
strcpy(str,buff+1);
//在
//printf("__%d__\n",__LINE__);
for(i = 0; i < strlen(str);i++)//客户端需要fgets接收字符串
{
//确定str的字符串位置
if( (' ' == *(str+i))&&(' ' == *(str+i+1)))
{
*(str+i) = '\0';
//写入sql中
//printf("%d\n",i);
//printf("__LINE%d__%s %s\n",__LINE__,str,str+i+2);
//找数据库是否有这个人的信息
//筛选信息名字是这个人
sprintf(sql,"SELECT * FROM user WHERE(user =\"%s\");",str);
//printf("%s\n",sql);
memset(username,0,sizeof(username));
strcpy(username,str);
//printf("%d%d\n",__LINE__,res_worng);
if((res = (sqlite3_exec(user_db,sql,callback_login,(void*)str+i+2,&errmsg))) != 0)
{
// printf("__%d__\n %d",__LINE__,res);
// //判断收到的信号是几如果是-1就是密码错误
printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
}
//判断传入的信息
//printf("%d %d",__LINE__,res_worng);
if(res_worng == -1)
{
printf("__%d__\n",__LINE__);
memset(buff,0,sizeof(buff));
buff[0] = 'W';
strcpy(buff+1,"USER IS NOEXIST");
ress = send(newfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("recv");
return NULL;
}
continue;
}
else if(res_worng == -3)
{
printf("__%d__\n",__LINE__);
memset(buff,0,sizeof(buff));
buff[0] = 'W';
strcpy(buff+1,"USER WRONG PASSWORD");
ress = send(newfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("recv");
return NULL;
}
continue;
}
else if(res_worng == -2)
{
memset(buff,0,sizeof(buff));
buff[0] = 'W';
strcpy(buff+1,"USER IS ONLINE");
ress = send(newfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("recv");
return NULL;
}
break;
}
else if(res_worng == 0)
{
memset(buff,0,sizeof(buff));
buff[0] = 'A';
strcpy(buff+1,"Successful insertion");
ress = send(newfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("recv");
return NULL;
}
//登陆成功此时把此人信息上的0置为1
memset(sql,0,sizeof(sql));
sprintf(sql,"UPDATE user SET online=1 WHERE(user =\"%s\");",str);
//printf("%s\n",sql);
//UPDATE stu SET score=60 WHERE id=1;
if((sqlite3_exec(user_db,sql,NULL,NULL,&errmsg)) != 0)
{
printf("sqlite3_exec error __%d__",__LINE__);
}
//printf("__%d__\n",__LINE__);
break;
}
}
}
}
else if('S' == buff[0]||'s' == buff[0])
{
//查找
char str[128] = "";
char sql[128]= "";
char time_time[32]="";
int res = 0;
int i = 0;
struct tm* info;
char** pres = NULL;
int row, column;
//printf("__%d__\n",__LINE__);
//printf("%s\n",buff+1);
memset(chinese,0,sizeof(chinese));
memset(english,0,sizeof(english));
strcpy(str,buff+1);
sprintf(sql,"SELECT * FROM dict WHERE(world =\"%s\");",str);
//printf("%s\n",sql);
if(sqlite3_get_table(db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
}
if(row < 1)
{
//printf("__%d__\n %d",__LINE__,row);
// //判断收到的信号是几如果是-1就是密码错误
//printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
//如果错误就是没有找到英文有误或者不存在
//printf("__%d__\n",__LINE__);
memset(buff,0,sizeof(buff));
buff[0] = 'W';
strcpy(buff+1,"ENGLISH IS NOEXIST");
ress = send(newfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("recv");
return NULL;
}
continue;
}
else
{ //清空再先给所有的0位置为'a'
memset(buff,0,sizeof(buff));
buff[0] = 'A';
if(row == 1)
{
strcpy(buff+1,pres[3]);
printf("%d %s\n",__LINE__,buff);
ress = send(newfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("recv");
return NULL;
}
memset(sql,0,sizeof(sql));
memset(time_time,0,sizeof(time_time));
strcpy(english,pres[2]);
strcpy(chinese,pres[3]);
time_t t = time(NULL);
info = localtime(&t);
sprintf(time_time,"%d/%d %d:%d:%d",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min,info->tm_sec);
sprintf(sql,"insert into user_history values (\"%s\",\"%s\",\"%s\",\"%s\");",username,english,chinese,time_time);
//printf("%s\n",sql);
if((sqlite3_exec(use_db,sql,NULL,NULL,&errmsg)) != 0)
{
printf("sqlite3_exec error __%d__",__LINE__);
}
}
else if(row == 2)
{
printf("%d",__LINE__);
for(int i=0;i < row;i++)
{
if(i == 0)
{
//将翻译位置上给他
strcpy(buff+1,pres[3]);
}
else
{
strcat((buff+strlen(pres[3])+3),pres[5]);
}
}
printf("__%d__%s,%s\n",__LINE__,buff+1,buff+3+strlen(pres[3]));
ress = send(newfd,buff,strlen(pres[3])+strlen(pres[5])+3,0);
if(ress < 0)
{
ERR_MSG("recv");
return NULL;
}
memset(chinese,0,sizeof(chinese));
memset(english,0,sizeof(english));
strcpy(english,pres[2]);
strcpy(chinese,pres[3]);
memset(sql,0,sizeof(sql));
memset(time_time,0,sizeof(time_time));
time_t t = time(NULL);
info = localtime(&t);
sprintf(time_time,"%d/%d %d:%d:%d",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min,info->tm_sec);
sprintf(sql,"insert into user_history values (\"%s\",\"%s\",\"%s\",\"%s\");",username,english,chinese,time_time);
//printf("%s\n",sql);
if((sqlite3_exec(use_db,sql,NULL,NULL,&errmsg)) != 0)
{
printf("sqlite3_exec error __%d__",__LINE__);
}
//第二个意义
memset(chinese,0,sizeof(chinese));
strcpy(chinese,pres[5]);
memset(sql,0,sizeof(sql));
memset(time_time,0,sizeof(time_time));
info = localtime(&t);
sprintf(time_time,"%d/%d %d:%d:%d",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min,info->tm_sec);
sprintf(sql,"insert into user_history values (\"%s\",\"%s\",\"%s\",\"%s\");",username,english,chinese,time_time);
//printf("%s\n",sql);
if((sqlite3_exec(use_db,sql,NULL,NULL,&errmsg)) != 0)
{
printf("sqlite3_exec error __%d__",__LINE__);
}
sqlite3_free_table(pres);
pres = NULL;
}
}
}
else if('B' == buff[0]||'b' == buff[0])
{
//登录循环接收信息并发送ask包或者是error
char str[128] = "";
char sql[128]= "";
int res = 0;
int i = 0;
//printf("__%d__\n",__LINE__);
printf("%s\n",buff+1);
//printf("__%d__\n",__LINE__);
strcpy(str,buff+1);
//在
//printf("__%d__\n",__LINE__);
*(str+i) = '\0';
sprintf(str,"UPDATE user SET online=0 WHERE(user =\"%s\");",username);
//printf("%s\n",str1);
//UPDATE stu SET score=60 WHERE id=1;
if( (sqlite3_exec(user_db,str,NULL,NULL,&errmsg)) != 0)
{
printf("sqlite3_exec error __%d__",__LINE__);
}
buff[0] = 'A';
strcpy(buff+1,"RETURN Successful");
ress = send(newfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("recv");
return NULL;
}
}
}
}
//回调函数
int callback_login(void *arg, int columns, char **column_text, char **column_name)
{
char *str = (char *)arg;
//printf("__%d__str =%s\n",__LINE__,str);
//for(int i = 0; i < 3;i++)
//printf("__%d__%s\n",__LINE__,*(column_text+i));
//res_worng先初始化
// res_worng = 0;
// printf("colums = %d",columns);
// printf("%d %s\n",__LINE__,*(column_text + 1));
//先判断是否有信息
// if(columns < 1)
// {
// //如果最开始用户名是空就可以直接返回用户不存在信息
// //printf("__%d__\n",__LINE__);
// res_worng = -1;
// return -1;
// }
//到这相当于于是有这个用户名的
//printf("%d %d\n",__LINE__,strcmp(str,*(column_text + 1)));
if(strcmp(str,*(column_text + 1)) == 0)
{
//printf("__%d__\n",__LINE__);
//有这个角色
//0的话就看登录条件是不是0如果是0就就
if(strcmp("0",*(column_text + 2)) == 0)
{
//printf("__%d__\n",__LINE__);
res_worng = 0;
return 0;
}
else
{
//-3 是已经登录,重复登录过程
res_worng = -2;
return 0;
}
}
else
{
//密码错误
res_worng = -3;
return 0;
}
}
//判断是否有这个英文或者是否存在
int callback_find(void *arg, int columns, char **column_text, char **column_name)
{
int size_chinese = 0;
memset(chinese,0,sizeof(chinese));
memset(english,0,sizeof(english));
//把中文翻译放进Chinese字符串中
strcpy(english,*(column_text));
strcpy(chinese,*(column_text+1));
//printf("%d__\n",__LINE__);
return 0;
}
客户端
#include <head.h>
//登录前的菜单
void before_login_mume();
//登录后的菜单
void after_login_mume(char* str);
//客户端的建立和服务器的连接
int Link_inet();
//登录
int Login();
//注册
int Registered();
//查找
void *Pth_work(void* arg);
//查找单词
int Find();
//查看历史
int search_history(char* name);
//退出登录
int Retu_break();
//TCP的IP头和PORT
//#define IP "192.168.8.220"
#define IP "192.168.0.226"
//#define IP "192.168.71.244"
#define PROT 5665
//判断错误
#define ERR_MSG(msg) do{\
fprintf(stderr,"line: %d\n",__LINE__);\
perror(msg);\
}while(0);
int newfd;
int sfd;
char english[32];
sqlite3* db;
sqlite3* user_db;
sqlite3* use_db;
int main(int argc,const char * argv[])
{
//建立tcp的
int newfd = Link_inet();
//分线程让线程解决和服务器交互
pthread_t tid;
if((pthread_create(&tid,NULL,(void*)Pth_work,NULL)) < 0)
{
printf("pthread_error __%d__\n",__LINE__);
}
pthread_join(tid,NULL);
return 0;
}
//菜单
void before_login_mume()
{
int a;
while(1)
{
system("clear");
printf("\t************************************\n");
printf("\t************************************\n");
printf("\t***************1.注册***************\n");
printf("\t***************2.登录***************\n");
printf("\t***************0.退出***************\n");
printf("\t************************************\n");
printf("\t************************************\n");
printf("\tENTER YOUR CHOOSE\n");
scanf("%d",&a);
getchar();
switch(a)
{
case 0:
exit(0);
break;
case 2:
//进行一个登录的函数
//判断返回值是否登录成功如果成功就进入下一个循环作业界面
Login();
break;
case 1:
Registered();
break;
default:
printf("CHOOSE ERROR\n");
continue;
}
getchar();
printf("PLEASE INPUT ENTER");
getchar();
}
}
void after_login_mume(char* str)
{
//打开数据库
if((sqlite3_open("./user.db",&user_db)) != 0)
{
printf("sqlite3_open error %d\n",sqlite3_errcode(user_db));
}
char str1[128] = "";
char *errmsg;
int a;
while(1)
{
system("clear");
printf("\t**********欢迎%s使用*****\n",str);
printf("\t************************************\n");
printf("\t************************************\n");
printf("\t***************1.退出***************\n");
printf("\t***************2.查找***************\n");
printf("\t***************3.历史***************\n");
printf("\t************************************\n");
printf("\t************************************\n");\
printf("\tENTER YOUR CHOOSE\n");
scanf("%d",&a);
getchar();
switch(a)
{
case 1:
// //并修改数据库置为0
// memset(str1,0,sizeof(str1));
// sprintf(str1,"UPDATE user SET online=0 WHERE(user =\"%s\");",str);
// //printf("%s\n",str1);
// //UPDATE stu SET score=60 WHERE id=1;
// if( (sqlite3_exec(user_db,str1,NULL,NULL,&errmsg)) != 0)
// {
// printf("sqlite3_exec error __%d__",__LINE__);
// }
Retu_break();
break;
case 2:
Find();
getchar();
break;
case 3:
search_history(str);
break;
default:
printf("CHOOSE ERROR\n");
continue;
}
if(a == 1)
{
//system("clear");
break;
}
printf("PLEASE INPUT ENTER\n");
getchar();
}
}
//TCP建立连接的过程
int Link_inet()
{
//创建流式字节套
sfd = socket(AF_INET,SOCK_STREAM,0);
if(sfd < 0)
{
ERR_MSG("socket");
return -1;
}
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PROT);
sin.sin_addr.s_addr = inet_addr(IP);
//和服务器连接
int newfd = connect(sfd,(struct sockaddr*)&sin,sizeof(sin));
if(newfd < 0)
{
ERR_MSG("connect");
return -1;
}
printf("connect success\n");
return sfd;
}
void *Pth_work(void* arg)
{
//int newfd = *(int*)arg;
int a;
//菜单栏的改变
before_login_mume();
pthread_exit(NULL);
}
//登录
int Login()
{
//登录 L/l 注册 R/r 查询 S/s 查询历史 H/h
int ress = 0,resv = 0;
char buff[128]="";
char str[20]="";
int a = 0;
char name[20] ="";
while(1)
{
memset(buff,0,sizeof(buff));
memset(str,0,sizeof(str));
buff[0] = 'L';
printf("请输入你的用户名\n");
scanf("%s",str);
//储存用户名
memset(name,0,sizeof(name));
strcat(buff+1,str);
strcat(name,str);
a = strlen(str);
printf("请输入你的密码\n");
memset(str,0,sizeof(str));
scanf("%s",str);
//储存密码
strcat(buff+1+a+2,str);
buff[a+1] =' ';
buff[a+2] =' ';
//发送信息给服务器登录信息并判断是否发送成功
ress = send(sfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("send");
return -1;
}
//接收信息
//printf("__%d__\n",__LINE__);
memset(buff,0,sizeof(buff));
resv = recv(sfd,buff,sizeof(buff),0);
//printf("%s\n",buff);
if(resv < 0)
{
ERR_MSG("recv");
return -1;
}
if('W' == buff[0]&&0 == strcmp(buff+1,"USER IS NOEXIST"))
{
//输入有误
printf("用户不存在,请先注册\n");
break;
}
else if('W' == buff[0]&&0 == strcmp(buff+1,"USER WRONG PASSWORD"))
{
printf("用户密码错误,请重新输入\n");
continue;
}
else if('W' == buff[0]&&0 == strcmp(buff+1,"USER IS ONLINE"))
{
printf("请不要重复登录,请重新输入\n");
break;
}
else if('A' == buff[0])
{
printf("登录成功\n");
after_login_mume(name);
break;
}
}
}
//注册
int Registered()
{
//登录 L/l 注册 R/r 查询 S/s 查询历史 H/h
int ress = 0,resv = 0;
char buff[128]="";
char str[20]="";
int a = 0;
while(1)
{
memset(buff,0,sizeof(buff));
buff[0] = 'R';
memset(str,0,sizeof(str));
printf("请输入你注册的用户名\n");
scanf("%s",str);
//储存用户名
strcat(buff+1,str);
a = strlen(str);
memset(str,0,sizeof(str));
printf("请输入你的密码\n");
scanf("%s",str);
//储存密码
strcat(buff+1+a+2,str);
buff[a+1] =' ';
buff[a+2] =' ';
//发送信息给服务器注册信息并判断是否发送成功
ress = send(sfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("send");
return -1;
}
//接收信息
//printf("__%d__\n",__LINE__);
memset(buff,0,sizeof(buff));
resv = recv(sfd,buff,sizeof(buff),0);
//printf("%s\n",buff);
if(resv < 0)
{
ERR_MSG("recv");
return -1;
}
if('W' == buff[0]&&0 == strcmp(buff+1,"USER IS EXIST"))
{
//输入有误
printf("用户已经存在,请不要重新注册\n");
break;
}
else if('A' == buff[0])
{
printf("注册成功\n");
break;
}
return 0;
//printf("__%d__\n",__LINE__);
}
}
//查找
int Find()
{
//登录 L/l 注册 R/r 查询 S/s 查询历史 H/h
int ress = 0,resv = 0;
char buff[128]="";
char str[20]="";
int a = 0;
char name[20] ="";
while(1)
{
memset(buff,0,sizeof(buff));
memset(str,0,sizeof(str));
memset(english,0,sizeof(english));
buff[0] = 'S';
printf("请输入需要查找的英文\n");
scanf("%s",str);
strcpy(english,str);
//储存英文
strcat(buff+1,str);
//发送信息给服务器登录信息并判断是否发送成功
ress = send(sfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("send");
return -1;
}
//接收信息
//printf("__%d__\n",__LINE__);
memset(buff,0,sizeof(buff));
resv = recv(sfd,buff,sizeof(buff),0);
//printf("%s\n",buff);
if(resv < 0)
{
ERR_MSG("recv");
return -1;
}
if('W' == buff[0]&&0 == strcmp(buff+1,"ENGLISH IS NOEXIST"))
{
//输入有误
printf("此英文不存在,请重新输入\n");
continue;;
}
else if('A' == buff[0])
{
int i =0;
// for( i=1;i < resv;i++)
// {
// printf("%d %c",i,buff[i]);
// }
// printf("\n");
printf("English\t Chinese\n");
//printf("%d\n",resv);
for( i=1;i < resv;i++)
{
if(buff[i+1] =='n'&&buff[i+2]=='.')
{
printf("%s\t %s\n",english,buff+1+i);
}
}
if(i >= resv)
{
printf("%s\t %s\n",english,buff+1);
}
break;
}
}
}
//查看历史
int search_history(char* name)
{
//打开数据库
if((sqlite3_open("./use.db",&use_db)) != 0)
{
printf("sqlite3_open error %d\n",sqlite3_errcode(user_db));
}
//登录 L/l 注册 R/r 查询 S/s 查询历史 H/h
char sql[128]= "";
char time_time[32]="";
int res = 0;
int i = 0;
struct tm* info;
char** pres = NULL;
int row, column;
int ress = 0,resv = 0;
char buff[128]="";
char str[20]="";
int a = 0;
char *errmsg;
//收到H信号就需要打开use.db
sprintf(sql,"SELECT * FROM user_history WHERE(user =\"%s\");",name);
//printf("%s\n",sql);
if(sqlite3_get_table(use_db, sql, &pres, &row, &column, &errmsg) != SQLITE_OK)
{
printf(" __%d__sqlites:%s\n",__LINE__,errmsg);
}
if(row < 1)
{
printf("无记录,请先查找单词\n");
}
else
//大于三天条只取最后2条
{
// for(int i=0; i<(row+1)*column; i++)
// {
// printf("%d %s\n",i,pres[i]);
// }
for(int i=0; i<(row+1)*column; i++)
{
printf("%s\t", pres[i]);
// if(i%column == column-2)
// printf("\t");
if(i%column == column-1)
putchar(10);
}
//释放空间
sqlite3_free_table(pres);
pres = NULL;
}
return 0;
}
//退出
int Retu_break()
{
//登录 L/l 注册 R/r 查询 S/s 查询历史 H/h 退出B/b
int ress = 0,resv = 0;
char buff[128]="";
char str[20]="";
int a = 0;
char name[20] ="";
while(1)
{
memset(buff,0,sizeof(buff));
memset(str,0,sizeof(str));
buff[0] = 'B';
//发送信息给服务器登录信息并判断是否发送成功
ress = send(sfd,buff,strlen(buff),0);
if(ress < 0)
{
ERR_MSG("send");
return -1;
}
//接收信息
memset(buff,0,sizeof(buff));
resv = recv(sfd,buff,sizeof(buff),0);
if(resv < 0)
{
ERR_MSG("recv");
return -1;
}
if('A' == buff[0])
{
int i =0;
printf("退出成功\n");
break;
}
}
}
用户不存在时
重复登录
查单词
查看历史