yuancheng printf

本文详细介绍了一个用于远程终端管理的系统,包括系统初始化、界面展示、命令接收与处理、心跳检查等核心功能。通过socket编程实现客户端与服务器间的连接与交互,确保了系统的稳定性和高效性。
#include "client.h"

int main(int argc,char **argv)
{
	if(argc != 2)
	{
		printf("Usage: %s file\n",argv[0]);
		return -1;
	}
	int sockfd;
	pthread_t t1;

	sockfd = creat_connect_sockfd(argv[1]);  //建立套接子并连接

	surface(); //界面

	if (user_check(sockfd) == 0)//用户名验证
	{
		close(sockfd);
		return 0;
	}

	if (pswd_check(sockfd) == 0)//用户密码验证
	{
		close(sockfd);
		return 0;
	}

	printf(
			"\n\n\n\t\t\033[35m***************     欢迎登录!     ***************\n\033[0m");
	printf("\n\t\t\t\t\033[31m请输入命令:\033[0m");
	fflush(stdout);

	pthread_create(&t1, NULL, heartbeat, (void*) &sockfd);
	select_menu(sockfd);
	return 0;
}

void *heartbeat(void*sockfd)
{
	while (1)
	{
		send((int) sockfd, "~OK~", BUF_SIZE, 0);
		sleep(10);
	}
}

void surface()
{
	system("clear");

	printf("\n\n\n\n\n\n\n\t\t\33[31m***********************************************\n\33[31m");
	printf("\t\t\033[34m         欢迎使用远程终端管理系统             \n\033[34m");
	printf("\t\t\33[31m***********************************************\n\033[31m");
	printf("\n\n\t\t\033[35m            提示:quit命令退出           \n\033[35m");
	
	printf("\n\t\t\033[30m            时间:2013.1.30                \n\033[30m");
	printf("\n\t\t\033[30m        版权所有,可以抄袭!!                \n\n\n\n\n\n\033[30m);	
	printf("\n\t\t\033[30m            作者:孟 腾 腾           \n\033[30m");
}

int creat_connect_sockfd(char *buf)
{
	int sockfd;
	SA_IN servaddr;
	socklen_t servlen = sizeof(servaddr);

	if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
	{
		perror("socket error");
		exit(-1);
	}

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = PF_INET;
	servaddr.sin_port = htons(2029);
	//servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	servaddr.sin_addr.s_addr = inet_addr(buf);

	if (connect(sockfd, (SA*) &servaddr, sizeof(servaddr)) < 0)
	{
		perror("fail to revcv");
		exit(-1);
	}

	return sockfd;
}


void select_menu(int sockfd)
{
	char buf[BUF_SIZE] =
	{ 0 };
	char buffer[BUF_SIZE] =
	{ 0 };
	fd_set global_rdfs, current_rdfs;
	int maxfd, nbyte;
	int i;

	FD_ZERO(&global_rdfs);
	FD_SET(STDIN_FILENO, &global_rdfs);
	FD_SET(sockfd, &global_rdfs);
	maxfd = sockfd;

	while (1)
	{
		current_rdfs = global_rdfs;
		if (select(maxfd + 1, ¤t_rdfs, NULL, NULL, 0) < 0)
		{
			perror("select error");
			exit(-1);
		}
		else
		{
			for (i = 0; i <= maxfd; i++)
			{
				if (FD_ISSET(i, ¤t_rdfs))
				{
					if (i == 0)
					{
						send_orders(sockfd);
					}
					else if (i == sockfd)
					{
						if ((nbyte = recv(sockfd, buf, sizeof(buf), 0)) <= 0)
						{
							close(sockfd);
							printf("\n\t\t\t\033[31m抱歉,服务器异常,您将自动下线!\n\033[0m");
							FD_CLR(i, &global_rdfs);
							return;
						}
						else
							recv_server(sockfd, buf);
					}
				}
			}
		}
	}
}

void quit_show()
{
	int i = 0;
	char buf[] =
			"\033[35m\t\t       感谢使用本产品,再见!\n\033[0m";
	system("clear");
	printf("\n\n\n\n\n\n\n\n");
	while (buf[i] != '\0')
	{
		putchar(buf[i]);
		fflush(stdout);
		usleep(20 * 1000);
		i++;
	}
	printf("\n\n\n\n\n\n\n\n");
}

int send_orders(int sockfd)
{
	char buf[BUF_SIZE] =
	{ 0 };
	char buffer[BUF_SIZE] =
	{ 0 };

	fgets(buf, BUF_SIZE, stdin);
	buf[strlen(buf) - 1] = '\0';
	sprintf(buffer, "#%s", buf);
	if (strncmp(buffer, "#quit", 5) == 0) //退出命令
	{
		buffer[0] = '$';
		send(sockfd, buffer, BUF_SIZE, 0);
		close(sockfd);
		quit_show();
		exit(-1);
	}

	send(sockfd, buffer, BUF_SIZE, 0);
	return 0;
}

void recv_server(int sockfd, char *buf)
{
	if (strncmp(buf, "命令执行完毕", 6) == 0)
	{
		printf("\t\t\t\t\033[34m%s\033[1m\n", buf);
		printf("\033[22;30m"); //恢复黑色
		printf(
				"\t\t\33[32m--------------------------------------------------\n\33[5m");
		printf("\t\t\t\t\033[31m请输入命令:\033[0m");
		fflush(stdout);
		return;
	}

	printf("\t\t\033[30m%s\033[1m", buf);
}

int user_check(int sockfd)
{
	char buf[BUF_SIZE] =
	{ 0 };
	char buffer[BUF_SIZE] =
	{ 0 };
	int chance = 3;
	printf("\n\n\n");
	while (chance--)
	{
		printf("\t\t\t\t\033[34m请输入帐号:\033[0m");
		memset(buf, 0, sizeof(buf));
		fgets(buf, sizeof(buf), stdin);
		buf[strlen(buf) - 1] = '\0';
		sprintf(buffer, "@%s", buf);

		send(sockfd, buffer, BUF_SIZE, 0);
		memset(buffer, 0, sizeof(buffer));
		recv(sockfd, buffer, 1, 0);

		if (buffer[0] == 'y')
			return 1;
	}
	return 0;
}

int pswd_check(int sockfd)
{
	char buf[BUF_SIZE] =
	{ 0 };
	char buffer[BUF_SIZE] =
	{ 0 };
	int chance = 3;

	while (chance--)
	{
		printf("\n\t\t\t\t\033[34m请输入密码:\033[0m");
		memset(buf, 0, sizeof(buf));
		pswd_unshow(buf);

		sprintf(buffer, "*%s", buf);

		send(sockfd, buffer, BUF_SIZE, 0);
		memset(buffer, 0, sizeof(buffer));
		recv(sockfd, buffer, BUF_SIZE, 0);

		if (buffer[0] == 'y')
		{
			return 1;
		}
	}
	printf("\n");
	return 0;
}

void pswd_unshow(char passWd[])
{
	int in;
	for (in = 0; in < 32; in++) //输入密码回显***
	{
		system("stty raw -echo");//关闭终端显示
		scanf("%c", &passWd[in]);
		system("stty -raw echo");//打开终端显示

		if (LINE_FEED == passWd[in] || GARRAGE_RETURN == passWd[in])
		{
			passWd[in] = 0;
			break;
		}
		printf("*");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值