基于linux环境tcp网络编程(在线英英词典)文档【2】

真心想学习的伙伴,需要库的朋友们请留言!

完整代码如下:

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;
}


 

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值