真心想学习的伙伴,需要库的朋友们请留言!
完整代码如下:
client.c
/*************************************************************************
File Name: client.c
Author: Young
motto: Continuous efforts will lead to a better future
Created Time: Sun 2 Sep 2018 10:00:05 CST
************************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define N 64
#define M 512
typedef struct //消息结构体
{
int type;
char name[N];
char data[M];
}MSG;
int n;
void help_l(); //帮助手册
void display_1(); //第一个界面显示
void display_2(); //查询界面显示
void display_3(int sockfd, MSG *msg); //查询界面函数
int login(int sockfd, MSG *msg); //登录函数
int register_z(int sockfd, MSG *msg); //注册函数
int search_word(int sockfd, MSG *msg); //单词查询函数
int history(int sockfd, MSG *msg); //历史记录查询函数
int return_l(int sockfd, MSG *msg); //返回上一级,给服务器发送相应的信号
int main(int argc, char *argv[])
{
int sockfd; //创建套接字
MSG msg;
/*1.创建套接字*/
sockfd=socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket");
return -1;
}
printf("socket success!\n");
/*2.主动连接服务器*/
struct sockaddr_in serv_addr;
serv_addr.sin_family =AF_INET;
serv_addr.sin_port =htons(8888);
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(0>connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)))
{
perror("connect");
return -1;
}
printf("connect success\n");
loop://使用无条件转移语句
while(1)
{
display_1(); //显示选择的页面
printf("please input num:");
scanf("%d",&n);
getchar(); //利用getchar吃掉垃圾字符
switch(n)
{
case 1:
if(1 == login(sockfd,&msg))//登录函数返回值为,说明登录成功,几个跳到第二个选择页面
{
goto loop1; //可用函数调用或者无条件转移,跳到第二个选择页面
}
break;
case 2:
register_z(sockfd,&msg);//注册用户
break;
case 3:
close(sockfd); //关闭套接字
return 0;
break;
case 4:
system("clear"); //清屏
break;
case 5:
help_l(); //帮助
break;
default:
printf("输入信息有误!\n");
}
}
loop1://第二个选择的页面
while(1)
{
display_2();
printf("please input num:");
scanf("%d",&n);
getchar(); //吃掉输入时的垃圾字符('\n')
switch(n)
{
case 1:
search_word(sockfd,&msg); //查询单词函数
printf("测试\n");
break;
case 2:
if(1 == history(sockfd,&msg)) //历史记录函数,返回值是1代表又跳到前一个选择页面
{
goto loop1;
}
break;
case 3:
return_l(sockfd,&msg);
goto loop; //跳到第一个选择页面
exit(0);
break;
case 4:
system("clear");//清屏功能
break;
case 5:
help_l(); //帮助手册
break;
default:
printf("输入信息有误!\n");
}
}
/*关闭套接字*/
close(sockfd);
return 0;
}
int return_l(int sockfd,MSG *msg)
{
msg->type=5;
if(0 > send(sockfd, msg, sizeof(MSG),0))
{
perror("send");
return -1;
}
return 0;
}
int login(int sockfd, MSG *msg)//登录函数
{
msg->type = 1;//选择数字功能为1
printf("please input user:");
scanf("%s",msg->name);
getchar();
printf("please input password:");
scanf("%s",msg->data);
getchar();
if(0 > send(sockfd,msg,sizeof(MSG),0)) //给客户端发送功能选择数字,用户名,密码
{
perror("send");
return -1;
}
if(0 > recv(sockfd,msg,sizeof(MSG),0)) //接受服务器返回的数据
{
perror("recv1");
return -1;
}
if(strncmp(msg->name,"OK",3) == 0) //比较数据是否查询成功
{
printf("%s\n","登录成功\n");
return 1;
}
else
printf("%s\n",msg->data); //打印出服务器返回来的正确或错误信息
return 0;
}
int register_z(int sockfd, MSG *msg) //注册函数
{
char buf[N];
memset(buf,0,sizeof(buf));
msg->type = 2 ;
printf("please input new user:");
scanf("%s",msg->name);
getchar();
printf("please input new passwd:");
scanf("%s",msg->data);
getchar();
printf("please again input new passwd:");
scanf("%s",buf);
getchar();
if(strcmp(buf,msg->data)==0) //两次密码一致时才会执行一下语句
{
if(0 > send(sockfd,msg,sizeof(MSG),0)) //发送数据
{
perror("send");
return -1;
}
if(0 > recv(sockfd, msg,sizeof(MSG),0)) //接受成功或失败数据
{
perror("recv2");
return -1;
}
printf("%s\n",msg->data); //打印成功或失败数据
}
else
{
printf("两次密码不一致,请重新注册!\n");
return 0;
}
return 0;
}
void help_l()
{
printf(" ---------------帮助手册---------------\n");
printf(" ----------请认真阅读帮助手册!---------\n");
printf(" ------请在实现功能栏输入相应的数字!---\n");
printf(" -------输入功能选项时一定得是数字!---\n");
printf(" ---登录: 用户名+密码------------------\n");
printf(" ---注册: 用户名+密码------------------\n");
printf(" ---查询: 根据单词查询相应的解释-------\n");
printf(" ---记录: 查看此软件历史记录-----------\n");
printf(" ---清屏: 对当前页面进行清屏-----------\n");
printf(" ---退出: 直接退出整个程序-------------\n");
return;
}
void display_1()//第一个界面显示
{
printf(" ************************************************************\n");
printf(" * *\n");
printf(" * 1:登录 2:注册 3:退出 4:清屏 5.帮助 *\n");
printf(" * *\n");
printf(" ************************************************************\n");
return ;
}
void display_2()//第一个界面显示
{
printf(" ************************************************************\n");
printf(" * *\n");
printf(" * 1.查询 2.历史记录 3.上一级 4:清屏 5.帮助 *\n");
printf(" * *\n");
printf(" ************************************************************\n");
return ;
}
int search_word(int sockfd, MSG *msg)//查询单词函数
{
msg->type = 3;
while(1)
{
printf("\n ******************** 上一级:# ********************\n");
printf("Please Input Word:");
scanf("%s",msg->name);
getchar();
if(strncmp(msg->name,"#",1)==0)//选择'#'则退出当前的循环查询
{
break;
}
if(0 > send(sockfd,msg,sizeof(MSG),0))//给服务器发送输入的数据
{
perror("send");
return -1;
}
if(0 > recv(sockfd, msg, sizeof(MSG),0))//接受服务器查询的数据
{
perror("recv");
return -1;
}
if(strncmp(msg->data,"NO",3) == 0)
{
printf("数据库中没有这个单词,请核对单词重新输入!\n");
}
else
printf("%s:\t%s\n",msg->name,msg->data);//打印服务器查询的数据
printf("\n");
}
return 0;
}