




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*filename:client.c*file:*Author:chenchangyou*version:1.0*date:2012.8.23*/#includeku1.hchar log_ip16;int sockfd;int main(int argc,char*argv)struct sockaddr_in servaddr;if(argc2)fprintf(stderr,usage %s hostnamen,argv0);return 0;if(sockfd=socket(AF_INET,SOCK_STREAM,0)0)perror(ERROR opening socket);return 0;elseprintf(socket ok!n);memset(&servaddr,0,sizeof(servaddr);servaddr.sin_family=AF_INET;/填充主机字节序的地址结构类型servaddr.sin_port=htons(2013);/atoiif(inet_pton(AF_INET,argv1,&servaddr.sin_addr.s_addr)0)return 0;elseprintf(pton ok!n);strcpy(log_ip,argv1);/把输入的ip复制到全局变量log_ip中/*(套接子,特定地址族的地址结构,第二个参数的字节数)*/if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)0)perror(connect failuren);close(sockfd);return 0;enter_main_screen(sockfd);close(sockfd);return 0;/功能:把注册信息打包并发送/参数:套接字/返回值:无void register_sys(int sockfd)while(1)int i=1;int t=0;int cnt=0;int k=0;char data64=0;register_cat(t,data);link_str(i,t,data);printf(the data :%s,data);if(cnt=write(sockfd,data,strlen(data)2)printf(错误输入超过三次,退出n);exit(0);if(strcmp(22,data)=0)printf(已经注册,请选这其他用户名n);break;k+;return ;/功能:void register_cat(int t,char *data)char a64=0;char b64=0;char c64=0;printf(please input user:);scanf(%s,a);getchar();strcpy(c,a);strcat(c,#);printf(please input password:);scanf(%s,b);getchar();strcat(c,b);strcpy(data,c);t=strlen(data);/*封装函数,把用户名 密码 ip 登录时间 按顺序封装到data中*/功能:把用户名 密码 ip 登录时间 按顺序封装到data/参数:用户名 密码 ip 登录时间 数据包void cat_name_key(char *data)char a64=0;char b64=0;char c64=0;char login_time32;/*产生一个登录用户的链接时间*/time_t now; struct tm *timenow; time(&now); timenow =localtime(&now);strcpy(login_time,asctime(timenow);printf(please input user:);scanf(%s,a);getchar();strcpy(c,a);strcat(c,#);printf(please input password:);scanf(%s,b);getchar();strcat(c,b);strcat(c,#);strcat(c,log_ip);strcat(c,#);strcat(c,login_time);strcpy(data,c);return;/*登录函数,参数有sockfd read() write() link_str(),功能是把数据包(数据包类型 字节数 用户名 密码)传送到服务器端*/void log_sys(int sockfd)while(1)int i=0;int t=0;int cnt=0;static int k=0;char data164=0;char data64=0;if(k2)printf(错误输入超过三次,退出n);exit(0);cat_name_key(data1);/输入用户名和密码并压缩成数据包t=strlen(data1);link_str(i,t,data1);if(cnt=write(sockfd,data1,strlen(data1)next=NULL;return head; /功能:创建注册用户链表空结点注册用户/参数:无/返回值:当前注册链表的头节点node_p create_node()/创建空结点,无指向node_p headp;headp=(node_p)malloc(sizeof(node_t);if(headp=NULL)exit(1);headp-next = NULL;return headp;/功能:加载注册用户信息/参数:注册用户链表的头节点/返回值:当前注册链表的头节点node_p load_user_information(node_p head)int fp;int cnt=0;UK uk = ;if(head=NULL)exit(1);node_p p=head-next;while(p!=NULL)head-next = p-next; free(p);p-next=NULL;p = head-next;if(fp=open(stb.txt,O_CREAT|O_RDONLY,0600)=-1)printf(不能打开文件n);exit(1);node_p headp = NULL;while(cnt=read(fp,&uk,sizeof(UK)!=0)headp =create_node();headp - uk = uk;printf(the username :%sn,headp-uk.username);printf(the key :%sn,headp-uk.key);headp-next=head-next;head-next=headp;close(fp);printf(加载学生信息成功n);return head;/功能:创建头节点/参数:无/返回值:当前用户链表的头节点node_pp create_newnode()/创建空结点,无指向node_pp headp;headp=(node_pp)malloc(sizeof(node_tt);if(headp=NULL)exit(1);headp-next = NULL;return headp;/*filename:menu.c*file:*Author:chenchangyou*version:1.0*date:2012.8.23*/#includeku1.h/功能:进入主界面/参数:套接字/返回值:空void enter_main_screen(int sockfd)while(1)int i=1;int choice=0;system(clear);printf(欢迎进入远程终端管理系统界面n);printf(=n);printf(1:登录n);printf(2:注册n);printf(0:退出n);printf(=n);printf(请选择:n);i=scanf(%d,&choice);getchar();while(i=0)printf(无此选项,请重新输入!n);while(getchar()!=n);/清空键盘缓冲i=scanf(%d,&choice);/再次输入选择getchar();/去掉换行符switch(choice) case 1:log_sys(sockfd);break;case 2:register_sys(sockfd);break;case 0:exit(0);default:printf(无此选项,请重新输入!);break; /功能:用户登录界面/参数:套接字/返回值:空void usermenu(int sockfd)while(1)int i=1;int choice=0;/心跳信号if( (signal(SIGALRM,signal_handler)=(void*)-1 )/生成SIGALRM信号printf(receive SIGALRM signal faluren);raise(SIGALRM);system(clear);printf(=n);printf(1:输入命令n);printf(2:查看当前用户n);printf(0:退出n);printf(=n);printf(请选择:n);i=scanf(%d,&choice);getchar();while(i=0)printf(无此选项,请重新输入!n);while(getchar()!=n);/清空键盘缓冲i=scanf(%d,&choice);/再次输入选择getchar();/去掉换行符switch(choice)case 1:input_cmd(sockfd);break;case 2:look_user(sockfd);break;case 0:exit(0);default :printf(无此选项,请重新输入!n);break;/功能:信号处理函数/参数:信号量/返回值:空void signal_handler(int signo)switch(signo)case SIGALRM:sent_heartbeat(sockfd);alarm(3);break;default:printf(心跳异常n);/功能:压缩心跳包,并发送心跳包/参数:套接字/返回值:空void sent_heartbeat(int sockfd)int i=3;int t=0;int cnt=0;char data64=0;char buff32=0;strcpy(data,log_ip);t=strlen(data);link_str(i,t,data);printf(the data :%s,data);if(cnt=write(sockfd,data,strlen(data)0)/发送命令参数perror(ERROR write to socket!n);if(cnt=read(sockfd,buff,sizeof(buff)-1) = -1)perror(ERROR read from socket!n);if(cnt=0)printf(server disconnected!n);buffcnt=0;printf(显示登录在服务端的ip地址n);printf(The server echo message: %sn,buff);/功能:把类型 字节数 数据 打包/参数:类型 字节 数据/返回值:空void link_str(int i,int t,char *data)int type = i;int size = t;char str64;char str164;sprintf(str,%d,type);strcat(str,#);sprintf(str1,%04d,size);strcat(str,str1);strcat(str,#);strcat(str,data);strcpy(data,str);return ;/功能:查看当前用户信息/参数:套接字/返回值:空void look_user(int sockfd)int i=2;int t=0;int cnt=0;char buffBUFFER_SIZE;char data64=0;char a32=tian;strcpy(data,a);t=strlen(data);link_str(i,t,data);printf(the data :%s,data);if(cnt=write(sockfd,data,strlen(data)0)/发送命令参数perror(ERROR write to socket!n);if(cnt=read(sockfd,buff,sizeof(buff)-1) = -1)perror(ERROR read from socket!n);if(cnt=0)printf(server disconnected!n);buffcnt=0;printf(The server echo message: %sn,buff);printf(当前用户信息已经在服务器端显示n);/功能:输入命令打包到服务器端,并接受服务器端执行命令返回的值/参数:套接字/返回值:空void input_cmd(int sockfd)int i=4;int t=0;int cnt=0;char data64=0;char a32=0;char buff2048=0;printf(please input (ls -l)/(pwd)(ipcs)/(ifconfig):);fgets(a,sizeof(a),stdin); printf(%s,a);strcpy(data,a);t=strlen(data);link_str(i,t,data);printf(the data :%s,data);if(cnt=write(sockfd,data,strlen(data)0)/发送命令参数perror(ERROR write to socket!n);memset(buff,0,sizeof(buff);while(cnt=read(sockfd,buff,sizeof(buff)-1) != -1)buffcnt=0;printf(执行命令显示的信息:%sn,buff);if(cnt next;while(headp!=NULL)write(fp,&headp-uk,sizeof(UK);headp=headp-next;printf(保存学生信息成功n); close(fp);pthread_mutex_unlock(&mutex);return ;/功能:接受客户端发送过来的心跳包,证明客户端在线/参数:心跳数据包 套接字/返回值:无void receive_heartbeat(char*data,int nsock)char a32=0;strcpy(a,data);int i=0;char *ptr=NULL;char str332=;/成功分割ptr=strtok(a,#);while(ptr!=NULL)strcpy(stri+,ptr);ptr=strtok(NULL,#);if(write(nsock,str2,strlen(str2)=-1)/把登录的ip发送到客户端显示perror(writen);return ;/功能:显示当前在线用户/参数:当前用户链表头节点 套接字/返回值:无void receive_look_user(node_pp headpp,int nsock)char buff4=0;node_pp headpp3=headpp-next;/char awhile(headpp3!=NULL)printf(the username :%s,headpp3-da.username);printf(the log_ip :%s,headpp3-da.log_ip);printf(the log_time :%s,headpp3-da.login_time);headpp3=headpp3-next;strcpy(buff,ok);if(write(nsock,buff,strlen(buff)=-1)perror(writen);return ;return;/功能:接受命令并执行,把显示内容用套接字发送客户端/参数:命令数据包 套接字/参数:无void output_cmd(char*data,int nsock)char a128;memset(a,0,sizeof(a);strcpy(a,data);FILE *fp;int len=0;char b130=0;strcpy(b,执行命令成功:);strcpy(b,a);char bufsize2048=0;/*分割服务端的字符串*/int i=0;char *ptr=NULL;char str432;/成功分割memset(str,0,sizeof(str);ptr=strtok(a,#);while(ptr!=NULL)strcpy(stri+,ptr);ptr=strtok(NULL,#);memset(a,0,sizeof(a);printf(the cmd :%s,str2);len = strlen(str2);str2len-1 = 0;if(fp=popen(str2,r)=NULL)exit(1);int fd = fileno(fp);int ret = read(fd,bufsize,sizeof(bufsize);bufsizeret = 0;if(write(nsock,bufsize,strlen(bufsize)=-1)perror(writen);return;save_information(b);memset(bufsize,0,sizeof(bufsize);pclose(fp);/close(1);/0标准输入 1标准输出 2标准出错 stdin标准输入流 stdout 标准输出流 stderr标准出错流/dup2(nsock,1);/system(str2);return;/功能:加载服务器的配置文件/参数:无/返回值:空void load_config_file()FILE *fp;if(fp=fopen(ifconfig.txt,rt)=NULL)printf(不能打开文件n);exit(1);fscanf(fp,server_ip=%sn,server_ip);fscanf(fp,port=%s,port);fclose(fp);return;/功能:对客户端发过来的用户信息进行校验,先判断是否是注册用户,在判断是否是已经登录的用户/发送过来的数据包 套接字 注册用户的链表的头节点 当前用户链表的头节点/返回值:无void log_user(char *data,int nsock,node_p head,node_pp headpp)char a128;strcpy(a,data);char c140=0;strcpy(c,重复登录:);strcpy(c,a);char d140=0;strcpy(d,登录失败:);strcpy(d,a);char e140=0;strcpy(e,登录成功:);strcpy(e,a);char buf4=0;/返回值存储区char *ptr=NULL;int i=0;char str632=;ptr=strtok(a,#);/分割服务端的字符串while(ptr!=NULL)strcpy(stri+,ptr);ptr=strtok(NULL,#);node_pp headpp1=create_newnode();/第二条链表的空节点/* 把登录用户的名字 ip 时间复制到空节点上*/strcpy(headpp1-da.username,str2);/用户名strcpy(headpp1-da.log_ip,str4);strcpy(headpp1-da.login_time,str5);node_p headp=head-next;while(headp!=NULL)if(strcmp(headp-uk.username,str2)=0)/判断是否是注册的用户if(strcmp(headp-uk.key,str3)=0)/判断是否是注册的用户的密码/*判断是否是已经登录的用户*/node_pp headpp2=headpp-next;/第二条链表的第一个节点while(headpp2!=NULL)if(strcmp(headpp2-da.username,str2)=0)save_information(c);strcpy(buf,22);/重复登录的用户的返回信息if(write(nsock,buf,strlen(buf)=-1)perror(writen);return;return;headpp2=headpp2-next;/*把登录的用户信息链接到第二条链表中*/pthread_mutex_lock(&mutex);/锁定互斥锁headpp1-next=headpp-next;headpp-next=headpp1;pthread_mutex_unlock(&mutex);/解开互斥锁strcpy(buf,12);/成功登录save_information(e);if(write(nsock,buf,strlen(buf)=-1)perror(writen);return;return;headp=headp-next;strcpy(buf,11);/登录失败save_information(d);if(write(nsock,buf,strlen(buf)=-1)perror(writen);return ;return;/功能:接受客户端的数据包分割出来的用户名和密码加载在链表中信息比较,不是注册用户把他写到文件中/参数:注册数据包,套接字 注册信息链表的头节点/返回值:无void register_user(char *data,int nsock,node_p head)char a128=0;strcpy(a,data);char b140=0;strcpy(b,重复注册:);strcpy(b,a);char c140=0;strcpy(c,注册成功:);s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供热管网改造工程招投标管理方案
- 大数据离线分析任务优化方案
- 宣传学校策划校内活动方案
- 整容医美考试题库及答案
- 征兵工作考试题库及答案
- 森林生态补水工程建设实施方案
- 热力设备远程监控系统方案
- 专业定制哺乳期离婚财产分割协议范本
- 校园周边安全教育黑板
- 教育培训机构股权转让与课程资源合作框架协议
- 研究生新生入学教育课件
- 2024年国家电投集团黄河公司招聘笔试参考题库含答案解析
- 航海英语会话(一)
- 道路工程安全技术交底
- 高三数学备课组高考数学经验总结
- 鼎捷T100-V1.0-票据资金用户手册-简体
- 城乡规划管理与法规系列讲座城乡规划的监督检查
- 第一单元知识盘点(含字词、佳句、感知、考点) 四年级语文上册 (部编版有答案)
- 钻井工程钻柱课件
- 小学硬笔书法课教案(1-30节)
- 周口市医疗保障门诊特定药品保险申请表
评论
0/150
提交评论