注册
登录
查询单词
查询历史记录
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ERRLOG(msg) \
do \
{ \
printf("%s,%s,%d\n", __FILE__, __func__, __LINE__); \
perror(msg); \
exit(-1); \
} while (0)
#define Z 1
#define D 2
#define Q 3
#define C 4
#define H 5
#define N 32
#define M 500
void handler(int x)
{
wait(NULL);
}
typedef struct _msg{
int xuanze;
char name[N];
char text[M];
}msg_t;
void do_register(int acceptfd,msg_t *msg,sqlite3 *my_db);
void do_login(int acceptfd,msg_t *msg,sqlite3 *my_db);
void do_chakan(int acceptfd,msg_t *msg,sqlite3 *my_db);
void do_history(int acceptfd,msg_t *msg,sqlite3 *my_db);
int main (int argc,const char *argv[])
{
int socketfd=0;
sqlite3 *my_db;
int acceptfd=0;
pid_t pid;
msg_t msg;
if((socketfd=socket(AF_INET,SOCK_STREAM,0))==-1){
ERRLOG("sockfd error");
}
if(sqlite3_open("my.db",&my_db)!=SQLITE_OK){
ERRLOG("open error");
}
struct sockaddr_in serveraddr;
memset(&serveraddr,0,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[2]));
serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
socklen_t serveraddr_len=sizeof(serveraddr);
if(bind(socketfd,(struct sockaddr*)&serveraddr,serveraddr_len)==-1){
ERRLOG("bind errror");
}
if(listen(socketfd,5)==-1){
ERRLOG("listen error");
}
signal(SIGCHLD,handler);
while(1){
if((acceptfd=accept(socketfd,NULL,NULL))==-1){
ERRLOG("acceptfd error");
}
if((pid=fork())==-1){
ERRLOG("创建进程失败");
}else if(pid==0){
while(recv(acceptfd,&msg,sizeof(msg_t),0)>0){
printf("%s %s\n",msg.name,msg.text);
switch (msg.xuanze){
case Z:
do_register(acceptfd,&msg,my_db);
break;
case D:
do_login(acceptfd,&msg,my_db);
break;
case H:
do_history(acceptfd,&msg,my_db);
break;
case C:
do_chakan(acceptfd,&msg,my_db);
break;
}
}
}else{
close(acceptfd);
}
}
return 0;
}
void do_register(int acceptfd,msg_t *msg,sqlite3 *my_db)
{
char buff[600]={0};
int ret=0;
sprintf(buff,"insert into usr values('%s','%s')",msg->name,msg->text);
if((ret=sqlite3_exec(my_db,buff,NULL,NULL,NULL))!=SQLITE_OK){
memset(msg->text,0,sizeof(msg->text));
strcat(msg->text,"error");
}else{
memset(msg->text,0,sizeof(msg->text));
strcat(msg->text,"注册成功");
}
if(send(acceptfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("send errro");
}
return ;
}
void do_login(int acceptfd,msg_t *msg,sqlite3 *my_db)
{
char buff[600]={0};
int now=0;
int column=0;
char **result=NULL;
int ret=0;
sprintf(buff,"select * from usr where name='%s' and pass='%s'",msg->name,msg->text);
if((ret=sqlite3_get_table(my_db,buff,&result,&now,&column,NULL))!=SQLITE_OK){
printf("%s\n",sqlite3_errmsg(my_db));
}
if(now==1){
memset(msg->text,0,sizeof(msg));
strcat(msg->text,"登录成功");
}else{
memset(msg->text,0,sizeof(msg));
strcat(msg->text,"error");
}
if(send(acceptfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("send error");
}
return;
}
void do_chakan(int acceptfd,msg_t *msg,sqlite3 *my_db)
{
FILE *fd;
char data[300]={0};
int i=0;
int len=strlen(msg->text);
int flag=0;
char shijian[128]={0};
int ret=0;
char buff[600]={0};
char word[32]={0};
strcpy(word,msg->text);
if((fd=fopen("dict.txt","r"))==NULL){
ERRLOG("fopen error");
}
while(fgets(data,sizeof(data),fd)!=NULL){
data[strlen(data)-2]='\0';
if(strncmp(msg->text,data,len)==0){
if(data[len+1]==' '){
while(data[i]!=' '){
i++;
}
while(data[i]==' '){
i++;
}
strcpy(msg->text,&data[i]);
printf("%s\n",msg->text);
if(send(acceptfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("send errror");
}
flag=1;
memset(msg->text,0,sizeof(msg->text));
goto next;
}
}
memset(data,0,sizeof(data));
}
memset(msg->text,0,sizeof(msg->text));
strcpy(msg->text,"没有这个单词");
if(send(acceptfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("send error");
}
next:
if(flag==1){
time_t t;
struct tm *tm;
if((t=time(NULL))==-1){
ERRLOG("获取时间失败");
}
if((tm=localtime(&t))==NULL){
ERRLOG("localtime error");
}
sprintf(shijian,"%04d:%02d:%02d %02d:%02d:%02d",tm->tm_year+1900,tm->tm_mon,tm->tm_mday,\
tm->tm_hour,tm->tm_min,tm->tm_sec);
sprintf(buff,"insert into shuju values('%s','%s','%s')",msg->name,shijian,word);
if((ret=sqlite3_exec(my_db,buff,NULL,NULL,NULL))!=SQLITE_OK){
ERRLOG("sqlite3 errror");
}
}
return ;
}
int callback(void *argc,int column,char **f_name,char **f_value)
{
msg_t msg;
memset(&msg,0,sizeof(msg));
int acceptfd=*(int *)argc;
sprintf(msg.text,"%s%s",f_name[1],f_name[2]);
if(send(acceptfd,&msg,sizeof(msg),0)==-1){
ERRLOG("send error");
}
return 0;
}
void do_history(int acceptfd,msg_t *msg,sqlite3 *my_db)
{
char buff[500]={0};
int ret=0;
sprintf(buff,"select * from shuju");
if((ret=sqlite3_exec(my_db,buff,callback,(void *)&acceptfd,NULL))!=SQLITE_OK){
printf("%s\n",sqlite3_errmsg(my_db));
}
memset(msg->text,0,sizeof(msg->text));
strcpy(msg->text,"over");
if(send(acceptfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("send error");
}
return ;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ERRLOG(msg) \
do \
{ \
printf("%s,%s,%d\n", __FILE__, __func__, __LINE__); \
perror(msg); \
exit(-1); \
} while (0)
#define Z 1
#define D 2
#define Q 3
#define C 4
#define H 5
#define N 32
#define M 500
typedef struct _msg{
int xuanze;
char name[N];
char text[M];
}msg_t;
void do_regesister(int socketfd,msg_t *msg);
int do_login(int socketfd,msg_t *msg);
void do_chakan(int socketfd,msg_t *msg);
void do_history(int socketfd,msg_t *msg);
int main(int argc, const char *argv[])
{
int socketfd = 0;
int choose=0;
msg_t msg;
if ((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
ERRLOG("socket error");
}
struct sockaddr_in clientaddr;
memset(&clientaddr,0,sizeof(clientaddr));
clientaddr.sin_family=AF_INET;
clientaddr.sin_port=htons(atoi(argv[2]));
clientaddr.sin_addr.s_addr=inet_addr(argv[1]);
socklen_t clientaddr_len=sizeof(clientaddr);
if(connect(socketfd,(struct sockaddr*)&clientaddr,clientaddr_len)==-1){
ERRLOG("connect error");
}
while(1){
printf("***********************************************\n");
printf("1注册 2登录 3退出\n");
printf("************************************************\n");
printf("请输入你您的选择>");
scanf("%d",&choose);
getchar();
switch(choose) {
case Z:
do_regesister(socketfd,&msg);
break;
case D:
if(do_login(socketfd,&msg)==1){
goto next;
}
break;
case Q:
printf("欢迎下次使用\n");
exit(-1);
break;
}
}
next:
while(1){
printf("**********************************************************\n");
printf("4查询******************5历史************************3退出\n");
printf("**********************************************************\n");
printf("请输入你您的选择>");
scanf("%d",&choose);
getchar();
switch (choose){
case C:
do_chakan(socketfd,&msg);
break;
case H:
do_history(socketfd,&msg);
break;
case Q:
printf("欢迎下次使用\n");
exit(-1);
break;
}
}
return 0;
}
void do_regesister(int socketfd,msg_t *msg)
{
memset(msg,0,sizeof(msg_t));
msg->xuanze=Z;
printf("请输入您的用户名");
scanf("%s",msg->name);
printf("请输入您的密码");
scanf("%s",msg->text);
if(send(socketfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("send error");
}
memset(msg->text,0,sizeof(msg->text));
if(recv(socketfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("recv errro");
}
if(strcmp(msg->text,"error")==0){
printf("用户已经存在\n");
}else{
printf("注册成功\n");
}
return ;
}
int do_login(int socketfd,msg_t *msg)
{
memset(msg,0,sizeof(msg_t));
msg->xuanze=D;
printf("请输入您的用户名");
scanf("%s",msg->name);
printf("请输入您的密码");
scanf("%s",msg->text);
if(send(socketfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("send errror");
}
memset(msg->text,0,sizeof(msg->text));
if(recv(socketfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("recv error");
}
if(strcmp(msg->text,"error")==0){
printf("登录失败,用户或者密码错误\n");
return 0;
}else{
printf("登录成功\n");
return 1;
}
}
void do_chakan(int socketfd,msg_t *msg)
{
while(1){
memset(msg->text,0,sizeof(msg->text));
msg->xuanze=C;
printf("请输入您要查询的单词");
scanf("%s",msg->text);
if(send(socketfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("查询失败");
}
memset(msg->text,0,sizeof(msg->text));
if(recv(socketfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("recv error");
}
printf("[%s]\n",msg->text);
}
return;
}
void do_history(int socketfd,msg_t *msg)
{
msg->xuanze=H;
if(send(socketfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("send error");
}
while(1){
memset(msg->text,0,sizeof(msg->text));
if(recv(socketfd,msg,sizeof(msg_t),0)==-1){
ERRLOG("recv error");
}
if(strcmp(msg->text,"over")==0){
break;
}
printf("%s\n",msg->text);
}
return ;
}