#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("*");
}
}