欢迎光临散文网 会员登陆 & 注册

TCP网络词典

2023-07-13 11:41 作者:明天会更好QHQ  | 我要投稿

一、安装sqlite库

在终端输入 sudo apt-get install sqlite3进行安装

安装完成后,输入sqlite3-version查看安装好的版本

二、创建一个服务器客户端共用的结构体。

typedef struct

{

    int type;

    char name[N];

    char data[256];

}MSG;

三、搭建客户端(封装函数实现客户端的多个功能)

①主函数搭建TCP客户端,

int sockfd定义一个文件描述符。

if(argc!=3)//判断输入格式是否正确

{

printf("%s pls input serverip port\n",argv[0]);

return -1;

}

//创建流式套接字

if((sockfd=socket(AF_INET,SOCK_STREAM,0)<0)

{

 perror(“创建套接字失败”);

return -1;

}

//网络信息填充

bzero(&serveraddr,sizeof(serveraddr));

severaddr.sin_family =AF_INET;

severaddr.sin_addr.s_addr =inet_addr(argv[1]);

serveraddr.sin_port =htons(atoi(argv[2]));

//连接服务器

if(connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(severaddr)<0)

{

perror("连接失败");

return -1;

}

②搭建客户端功能界面(可以自己设置好看点的界面)

while(1)

{

printf("*****************************************************\n");

printf("*****1.register****2.login********3.quit************\n);

printf("******************************************************\n);

printf("please choose:");

scanf("%d",&n);

getchar()

switch(n)

{

case 1:

do_register(sockfd,&msg);//注册功能

break;

case 2:

if(do_login(sockfd,&msg)==1)

goto next;//登录成功跳转二级菜单

break;

case 3:

close(sockfd)//关闭文件描述符退出

exit(0);

break;

default:

printf("输入错误请重新输入\n");

     }

}

③实现注册功能(封装一个函数实现注册功能)

int do_register(int sockfd,MSG *msg)//文件描述符,传输结构体

{

msg->type =R;//R定义在头文件 表示用户需要注册功能

printf("input id:");

scanf("%s",msg->name);

getchar();

printf("pls input password:");

scanf("%s",msg->data);

if(send(sockfd,msg,sizeof(MSG),0)<0)

{

  printf("发送失败\n");

 return -1;

}

if(recv(sockfd,msg,sizeof(MSG),0)<0)

{

printf("接收失败\n");

return -1;

}

printf("%s\n",msg->data);

return 0;

}

④实现登录功能

int do_login(int sockfd,MSG*msg)

{

msg->type =L;

printf("pls input id:");

scanf("%s",msg->name);

getchar();

printf("pls input password:");

scanf("%s",msg->data);

if(send(sockfd,msg,sizeof(MSG),0)<0)

{

printf("发送失败\n");

return -1;

}

if(recv(sockfd,msg,sizeof(MSG),0)<0)

{

printf("接收失败\n");

return -1;

}

if(strncmp(msg->data,""ok",3)==0)

printf("登录成功\n");

return 1;

}

else

{

printf("%s",msg->data);

     }

return 0;

}

⑤创建二级菜单

next:

  while(1)

{

printf("************************************************************\n");

printf("*******1查询*****2历史记录*******3退出*****************\n");

printf("************************************************************\n");

printf("************************************************************\n");

printf("pls choose:");

scanf("%d",&n);

getchar();

switch(n)

{

case 1:

do_query(sockfd.&msg);

break;

case 2:

do_history(sockfd,&msg);

break;

case 3:

close(sockfd);

exit(0);

break;

default:

printf("invalid data cmd\n");

       }

}

⑥实现查询功能

int do_query(int sockfd,MSG*msg)

{

msg->type =Q;

while(1)

{

printf("pls input word:");

scanf("%s",msg->data);

getchar();

if(strncmp(msg->data,"#",1)==0)//输入#退出到上一级菜单

break;

if(send(sockfd,msg,sizeof(MSG),0)<0)

{

printf("发送失败\n");

return -1;

}

if(recv(sockfd,msg,sizeof(MSG),0)<0)

{

printf("接收失败\n");

return -1;

}

return 0;

}

⑦时间查询历史记录功能

int do_history(int sockdf,MSG*msg)

{

msg->type=H;

send(sock,msg,sizeof(MSG),0);

while(1)

{

recv(sockfd,msg,sizeof(MSG),0);

if(msg->data[0]=='\0')

break;

printf("%s\n",msg->data);

}

return 0;

}

三\创建TCP服务器

①打开数据库

在数据库的当前路径下创建一个名为word.txt的文件 文件中存放单词导入到词库.

if(sqlite3_open(DATABASE,&db)!=SQLITE_OK)

{

printf("%s\n",sqlite3_errmsg(db));

return -1;

}

else

printf("open DATABASE success\n");

②搭建TCP服务器

创建流式套接字

if((sockfd=socket(AF_INET,SOCK_STREAM,0)<0)

{

perror("faill to socket");

return -1;

}

填充网络信息

bzero(&serveraddr,sizeof(serveraddr));

severaddr.sin_family =AF_INET;

serveraddr.sin_addr.s_addr=inet_addr(argv[1]);

severaddr.sin_port=htons(atoi(argv[2]));

bind绑定

if(bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0)

{

perror("fail to bind\n");

return -1;

}

将套接字设置为监听 等待客户端链接

if(listen(sockfd,5)<0)

{

printf("fail to listen\n");

return -1;

}

②创建一级菜单

while(1)

{

if((acceptfd=accept(sockfd,NULL,NULL))<0)

{

perror("fail to accept");

return -1;

}

//创建父子进程

if((pid=fork())<0)

{

perror("fail to fork");

return -1;

}

else if(pid==0)

{

close(sockfd);

do_cilent(acceptfd,db);

}

else 

 {

close(acceptfd);

  }

}

③ 注册功能

void do_register(int acceptfd,MSG*msg,sqlite3*db)

{

char*errmsg;

char sql[128];

//创建表格

char sql1[128]="create table if not exists usr(id char,password char)";

char *errmsg1=NULL;

if(sqlite3_exec(db,sql1,NULL,NULL,&errmsg1)!=SQLITE_OK)

{

printf("sqlite3_exec failed:%s_%d_\n",errmsg1,_LINE_);

return;

}

printf("create table dict success _&d_\n",_LINE_);

sprintf("%s\n",errmsg);

strcpy(msg->data,,"usr name already exist");

else

{

printf("cilent register ok!\n");

strcpy(msg->data,"ok!");

}

if(send(acceptfd,msg,sizeof(MSG),0)<0)

   { 

perror("发送失败\n");

return;

   }

return;

}

④登录功能

int do_login(int acceptfd,MSG*msg,sqlite3*db)

{

char sql[128]={};

char *errmsg;

int nrow;

int ncloumn;

char **resultp;

sprintf(sql,"select *from usr whrer id='%s' and password ='%s';",msg->name,msg->data);

printf("%s\n",sql);

if(sqlite3_get_table(db,sql,&resulyp,&nrow,&ncloumn,&errmsg)!=SQLITE_OK)

{

printf("%s\n",errmsg);

return -1;

}

else

{

printf("get table ok\n");

}

//库里面如果存储了改用户的信息,跳转到二级界面 登录成功

if(nrow==1)

{

strcpy(msg->data,"OK");

send(acceptfd,msg,sizeof(MSG),0);

return -1;

}

if(nrow==0)

     {

strcpy(msg->data,"用户或者密码错误\n");

send(acceptfd,msg,sizeof(MSG),0);

return 0;

     }

return 0;

}

⑤单词比对功能

int do_searchword(int acceptfd,MSG*msg,char word[])

{

FILE*fp;

int len=0;

char temp[512];

int result;

char *p

if((fp=fopen("word.txt","r")==NULL)

{

perror("fail to fopen\n");

strcpy(msg->data,"打开词库失败\n");

send(acceptfd,msg,sizeof(MSG),0);

return -1;

}

len =strlen(word);

printf("%s",len=%d\n",word,len);

while(fgets(temp,512,fp)!=NULL)

{

printf("%s\n",temp);

result=strncmp(temp,word,len);

if(result>0)

{

continue;

}

if(result<0||temp[len]!=' ');

{

break;

}

else{

printf("已经找到单词\n");

p=temp+len;

while(*p=='  ')//把空格去掉

{

p++;

}

strncpy(msg->data,p);

printf("%s\n",msg->data);

send(acceptfd,msg,sizeof(MSG),0);

fclose(fp);

return 1;

  }

}

fclose(fp);

return 0;

}

⑥获取时间函数

int get_date(char *date)

{

time_t t;

struct tm*tp;

time(&t);

tp=loctaltime(&t);

sprintf(data,"%d-%d-%d %d:%d:%d",tp->tm_year+1990,tp->tm_mon+1,tp->mday,tp->tm_hour,tp->tm_min,tp->sec);

return 0;

}

⑦查询单词功能

int do_query(int acceptfd,MSG*msg,sqlite3*db)

{

char word[128];

int found=0;

char data[128];

char sql[128];

char *errmsg;

strcpy(word,msg->data);

found = do_searchword(acceptfd,msg,word);

char sql1[128]="create table if not exists recode(id char,word,char,mean char,time int);";

char *errmsg1=NULL;

if(sqlite3_exec(db,sql1,NULL,NULL,&errmsg1,_LINE_)!=SQLITE_OK)

{

printf("sqlite3_exec failed:%s _%d_\n",errmsg1,_LINE_);

return -1;

}

sprintf(sql1,"sqlect *from record where name= %s";,msg->name);

if(found==1)

{

get_data(date);

sprintf(sql,"insert into record valuse('%s','%s','%s')",msg->name,data,word);

printf("%s\n",sql);

if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)

{

printf("%s\n",errmsg);

return -1;

  }

}

else

{

strcpy(msg->data,"not found!");

}

send(acceptfd,msg,sizeof(MSG),0);

return  0;

}

⑧查询历史

int do_histroty(int acceptfd,MSG*msg,sqlite3*db)

{

char sql[128]={};

char *errmsg;

if(sqlite3_exec(db,sql,history_callback,(void*)&acceptfd,&errmsg)!=SQLITE_OK)

printf("%s\n",errmsg);

else

{

printf("%s\n",errmsg);

}

else

printf("quety record done\n");

msg->data[0]='\0';

send(acceptfd,msg,sizeof(MSG),0);

rerurn 0;

}

⑨得到查询结果 发送给客户端

int history_callback(void*arg,int f_num,char **f_value,char **f_name)

{

int acceptfd;

MSG msg;

acceptfd =*((int *)arg);

sprintf(msg.data,"%s","%s",f_value[1],f_value[2]);

send(acceptfd,&msg,sizeof(MSG),0);

return 0;

}

⑩处理客户端

int do_client(int acceptfd,sqlite3*db)

{

MSG msg;

while("type:%d\n",msg.type);

{

printf("type:%d\n",msg.type);

switch(msg.type)

{

case R:

do_register(acceptfd,^msg,db)

break;

case L:

do_login(acceptfd,&msg,db);

break;

case Q:

do_query(acceptfd,^msg,db);

break;

case H:

do_history(acceptfd,&msg,db);

break;

default:

printf("invalid data msg\n");

}

}

TCP网络词典的评论 (共 条)

分享到微博请遵守国家法律