远程控制系统.docx
四川大学计算机学院、软件学院实验报告课程 名称信息安全产品开辟实践实验课时5实验 项目远程控制系统实验时间2022年9月22号1)继续了解Linux下C语言程序开辟的过程实验 2)继续了解Socket网络编程目的3)回顾流套接字与数据报套接字4) 了解远程控制系统的流程及其实现的两种方式(TCP和UDP)实验环境 VMware5. 0, RedHat Linux 9. 0利用数据报套接字实现一个简单的远程控制系统:1 .客户端输入“quit”,客户端程序与服务器端程序打印退出信息,实验 内容 (算 法、 程 序、 步骤 和方 法)终止程序的执行;2 .客户输入命令,客户端将命令通过流套接字发送给客户端,服务 器执行收到的命令,并将结果发送到客户端显示;3 .如果没有客户输入的命令,服务器发送命令非法信息,并在客户 端显示该条信息。4 .编写实验报告:Vaimien.,XW)fttqp wiB> «o *t:a ";” ToDattn sin1 Vat f.imif -1。 fit» /M® 8<v gg(6):客户端输入字符串Is,服务器端解析输出结果:1stme «<«> ficv ikmf咤, mIT。0&0口0m(7):客户端继续输入字符串who, how,服务器端解析输出结果«!” fit»(8):客户端输入quit命令,断开连接,服务器正确反应,与客户端脱离连 接附试验源代码:UDPserver.cftinclude <stdio.h>ftinclude <stdlib.h>ftinclude <string. h>ftinclude <sys/socket.h> ftinclude <netinet/in.h>#include <sys/types.h> ftdefine PORT 8900ttdefine BUFSIZE 2048 int execute(char*command, char*buf)FILE *fp;int count;char commandbuf2056;if (NULL=command) | | (NULL=buf)(perror ("command or buf is emptyn);return -1;)count =0;memset(commandbuf, 0, 2056);strcat (commandbuf, z/sh -c );strcat(commandbuf, command);fprintf (stderr, z/the command is %snz/, commandbuf);if (NULL=(fp=popen(commandbuf, r)perror (create pipe errornz/);return -1;)while (count<2047) && (EOF! = (bufcount+=fgetc(fp);buf count-l=,0'return count;int main()(int sockfd;int conn_sock;char sendbufBUFSIZE;char recvbufBUFSIZE;int sendnum;int recvnum;int length;struct sockaddr_in client;struct sockaddr_in server;int opt;int ent;int lens;memset(&client, 0, sizeof(client);memset(feserver, 0, sizeof(server);memset(sendbuf, 0, BUFSIZE);memset (recvbuf, 0, BUFSIZE);length=0;sockfd=-l;conn_sock=-l;opt=SO_REUSEADDR;if(-1=(sockfd二socket(AF_INET, SOCK_DGRAM, 0)(perror ("Create socket errornz/);exit (1);)setsockopt(sockfd, S0L_S0CKET, S0 REUSEADDR, &opt, sizeof (opt);server. sin_family=AF_INET;server. sin_addr. s_addr=htonl(INADDR_ANY);server. sin_port=htons(PORT);if (-l=bind(sockfd, (struct sockaddr*)&server, sizeof (struct sockaddr)perror (z/bind socket errornz/);close(sockfd);return -1;)while (1)(while (1)(memset (recvbuf, 0, BUFSIZE);memset (sendbuf, 0, BUFSIZE);length=sizeof(struct sockaddr);if (0>=(recvnum=recvfrom(sockfd, recvbuf, BUFSIZE,0, (struct sockaddr*)&client, &length)(perror (/zthe commucation errorn/z);close(sockfd);列出程序运行状态、截图、配文字说明;在进行试验之前先来回顾一下UDP套接字编程的流程:Server上图反应了在进行数据报套接字编程时服务器端和客户端需要做得工作,从中 我们可以看出服务器端需要经过五个步骤,而客户端只需要四个步骤。远程控制的原理如下: 客户端接收用户输入的命令,客户端通过套接字将命令传送给服务器端, 服务器在收到用户的命令,对命令进行解析 在服务器端调用对应的命令 并将命令执行的结果发送给客户端,从而实现远距离控制的功能。从远程控制的原理并结合UDP套接字编程的流程我们可以画出用UDP实现远程 控制的流程图,如下:return -1;recvbufrecvnum0;fprintf (stderr, z/the command is:%sn/z, recvbuf);if (0=strcmp(recvbuf, quit)(fprintf (stderr, z/the client is quitn);break;if (1>= (cnt=execute (recvbuf, sendbuf)(againn);sprintf (sendbuf, /zthe invalid command, please tryfprintf (stderr, /zthe result is n%s/z, sendbuf);sendnum=strlen(sendbuf);lens=sizeof(struct sockaddr);if (0>=sendto(sockfd, sendbuf, sendnum, 0, (struct sockaddr*)&client, lens)(perror (/zthe commucation errorn/z);close(sockfd);return -1;)close (sockfd);)UDPclient. cftinclude <stdio. h>ftinclude <stdlib. h>ftinclude <string.h>ftinclude <sys/types. h>ftinclude <sys/socket.h>ftinclude <netinet/in.h>ftinclude <netdb.h>ttdefine PORT 8900ttdefine BUFSIZE 2048void printusage(char*command)i f (NULL=command)exit (-1);fprintf (stderr, /zthe useage of %s :/z, command);fprintf (stderr, z/%s IPADDRn,command);return;)int main(int argc, char* argv)int sockfd;int length;struct sockaddrin server;int sndnum;int recvnum;char sendbufBUFSIZE;char recvbufBUFSIZE;sockfd=-l;length=0;if (2!=argc)(printusage (argv 0);return -1;)if (-1=(sockfd=socket(AF_INET, S0CK_DGRAM, 0)(perror ("create socket errornz/);return -1;)memset (&server, 0, sizeof(struct sockaddr);server. sin_family=AF_INET;server, sin addr. s addr = inet addr(argvl);server. sin_port = htons (PORT);while (1)(fprintf (stderr, /ZUDP>Z,);memset (recvbuf, 0, BUFSIZE);memset(sendbuf, 0, BUFSIZE);fgets (sendbuf, BUFSIZE, stdin);length=strlen(sendbuf);sendbuflength-1=,0;sndnum=strlen(sendbuf);if (0>sendto (sockfd, sendbuf, sndnum, 0, (struct sockaddr*)fcserver, sizeof(struct sockaddr)(perror (z/send errorn/z);close(sockfd);exit (-1);if (0=strcmp(sendbuf, quit)(fprintf(stderr, "quit.n);close (sockfd);exit (0);if (0>=(recvnum=recvfrom(sockfd, recvbuf, BUFSIZE, 0, (struct sockaddr &server, fclength)(perror (,zread errorn/z);close(sockfd);exit (-1);recvbufrecvnum=,0;fprintf (stderr, /zthe result: nz/);fprintf (stderr, sn,recvbuf);数据记录和计算详细见上面结 论 (结 果)使用套接字能实现远程控制,且有TCP和UDP两种形式。通过本实验,我掌握了:1)进一步熟悉了 Linux下C语言程序开辟的过程;2)进一步了解Socket网络编程,巩固了对UDP和TCP编程;3) 了解了远程控制的原理;4)学会了使用数据报套接字来实现远程控制;目前我存在的问题有:套接字的函数比较繁琐,掌握的不是很熟练。指导 老师 评 议成绩评定:指导教师签名:实验报告说明专业实验中心实验名称 要用最简炼的语言反映实验的内容。如验证某程序、定律、算法,可写成“验 证XXX” ;分析XXX。实验目的 目的要明确,要抓住重点,可以从理论和实践两个方面考虑。在理论上,验证 定理、公式、算法,并使实验者获得深刻和系统的理解,在实践上,掌握使用实验设备的 技能技巧和程序的调试方法。普通需说明是验证型实验还是设计型实验,是创新型实验还 是综合型实验。实验环境实验用的软硬件环境(配置)。实验内容(算法、程序、步骤和方法)这是实验报告极其重要的内容。这部份要写明依据何种原理、定律算法、或者操作方法进行实验,要写明经过哪几个步骤。还应该画出流图(实验装置的结构示意图),再配以相应的文字说明,这样既可以节省许多文字说明, 又能使实验报告简明扼要,清晰明白。数据记录和计算 指从实验中测出的数据以及计算结果。结论(结果)即根据实验过程中所见到的现象和测得的数据,作出结论。小结对本次实验的体味、思量和建议。备注或者说明可写上实验成功或者失败的原因,实验后的心得体味、建议等。注意:.实验报告将记入实验成绩;每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。下面介绍本试验的具体步骤:(1):打开虚拟机,在Linux下的VI编辑器中编写服务器端程序UDPserver. c Vat timiaXft。Hlj,ftCt)«C>比 0 »。0今龄013 Sinr> a ni*, ;二m x、 tEQ高Jm使用命令 gcc - o UDPserver UDPserver. c - g 编译;* XXT*,)“X,at t)(接 上) 实验 内容 (算 法、程 序、 步骤 和方 法)(3):编写客户端程序:UDPclient. c urt力mo “s stv wib> «v t<>p 勤 一»C0 0龄 tir si n Vai I.nutbf 1 9me e«!«> acv um® a<v g' a, 下。今&0日501(4):使用 gee - o UDPclient UDPclient. c - g 命令编译 flfit V) AJMle第使用setup命令配置虚拟机的IP地址为10. 0. 0. 222(6):执行服务器端代码(./UDPserver),客户端连接服务器(./UDPclient10. 0.0.22):