远程控制系统.docx
《远程控制系统.docx》由会员分享,可在线阅读,更多相关《远程控制系统.docx(18页珍藏版)》请在冰豆网上搜索。
远程控制系统
四川大学计算机学院、软件学院
实验报告
课程名称
信息安全产品开发实践
实验课时
5
实验项目
远程控制系统
实验时间
2011年9月22号
实验目的
1)继续了解Linux下C语言程序开发的过程
2)继续了解Socket网络编程
3)回顾流套接字与数据报套接字
4)了解远程控制系统的流程及其实现的两种方式(TCP和UDP)
实验环境
VMware5.0,RedHatLinux9.0
实验内容(算法、程序、步骤和方法)
•利用数据报套接字实现一个简单的远程控制系统:
1.客户端输入“quit”,客户端程序与服务器端程序打印退出信息,终止程序的执行;
2.客户输入命令,客户端将命令通过流套接字发送给客户端,服务器执行收到的命令,并将结果发送到客户端显示;
3.如果没有客户输入的命令,服务器发送命令非法信息,并在客户端显示该条信息。
4.编写实验报告:
列出程序运行状态、截图、配文字说明;
在进行试验之前先来回顾一下UDP套接字编程的流程:
上图反应了在进行数据报套接字编程时服务器端和客户端需要做得工作,从中我们可以看出服务器端需要经过五个步骤,而客户端只需要四个步骤。
远程控制的原理如下:
•客户端接收用户输入的命令,客户端通过套接字将命令传送给服务器端,
•服务器在收到用户的命令,对命令进行解析
•在服务器端调用对应的命令
•并将命令执行的结果发送给客户端,从而实现远距离控制的功能。
从远程控制的原理并结合UDP套接字编程的流程我们可以画出用UDP实现远程控制的流程图,如下:
下面介绍本试验的具体步骤:
(1):
打开虚拟机,在Linux下的VI编辑器中编写服务器端程序UDPserver.c
(2)使用命令gcc–oUDPserverUDPserver.c–g编译;
(接上)
实验内容(算法、程序、步骤和方法)
(3):
编写客户端程序:
UDPclient.c
(4):
使用gcc–oUDPclientUDPclient.c–g命令编译
(5)使用setup命令配置虚拟机的IP地址为10.0.0.222
(6):
执行服务器端代码(./UDPserver),客户端连接服务器(./UDPclient10.0.0.22):
(6):
客户端输入字符串ls,服务器端解析输出结果:
(7):
客户端继续输入字符串who,how,服务器端解析输出结果
(8):
客户端输入quit命令,断开连接,服务器正确反应,与客户端脱离连接
附试验源代码:
UDPserver.c
#include
#include
#include
#include
#include
#include
#definePORT8900
#defineBUFSIZE2048
intexecute(char*command,char*buf)
{
FILE*fp;
intcount;
charcommandbuf[2056];
if((NULL==command)||(NULL==buf))
{
perror("commandorbufisempty\n");
return-1;
}
count=0;
memset(commandbuf,0,2056);
strcat(commandbuf,"sh-c");
strcat(commandbuf,command);
fprintf(stderr,"thecommandis%s\n",commandbuf);
if(NULL==(fp=popen(commandbuf,"r")))
{
perror("createpipeerror\n");
return-1;
}
while((count<2047)&&(EOF!
=(buf[count++]=fgetc(fp))));
buf[count-1]='\0';
returncount;
}
intmain()
{
intsockfd;
intconn_sock;
charsendbuf[BUFSIZE];
charrecvbuf[BUFSIZE];
intsendnum;
intrecvnum;
intlength;
structsockaddr_inclient;
structsockaddr_inserver;
intopt;
intcnt;
intlens;
memset(&client,0,sizeof(client));
memset(&server,0,sizeof(server));
memset(sendbuf,0,BUFSIZE);
memset(recvbuf,0,BUFSIZE);
length=0;
sockfd=-1;
conn_sock=-1;
opt=SO_REUSEADDR;
if(-1==(sockfd=socket(AF_INET,SOCK_DGRAM,0)))
{
perror("Createsocketerror\n");
exit
(1);
}
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
server.sin_family=AF_INET;
server.sin_addr.s_addr=htonl(INADDR_ANY);
server.sin_port=htons(PORT);
if(-1==bind(sockfd,(structsockaddr*)&server,sizeof(structsockaddr)))
{
perror("bindsocketerror\n");
close(sockfd);
return-1;
}
while
(1)
{
while
(1)
{
memset(recvbuf,0,BUFSIZE);
memset(sendbuf,0,BUFSIZE);
length=sizeof(structsockaddr);
if(0>=(recvnum=recvfrom(sockfd,recvbuf,BUFSIZE,0,(structsockaddr*)&client,&length)))
{
perror("thecommucationerror\n");
close(sockfd);
return-1;
}
recvbuf[recvnum]='\0';
fprintf(stderr,"thecommandis:
%s\n",recvbuf);
if(0==strcmp(recvbuf,"quit"))
{
fprintf(stderr,"theclientisquit\n");
break;
}
if(1>=(cnt=execute(recvbuf,sendbuf)))
{
sprintf(sendbuf,"theinvalidcommand,pleasetryagain\n");
}
fprintf(stderr,"theresultis\n%s",sendbuf);
sendnum=strlen(sendbuf);
lens=sizeof(structsockaddr);
if(0>=sendto(sockfd,sendbuf,sendnum,0,(structsockaddr*)&client,lens))
{
perror("thecommucationerror\n");
close(sockfd);
return-1;
}
}
}
close(sockfd);
}
UDPclient.c
#include
#include
#include
#include
#include
#include
#include
#definePORT8900
#defineBUFSIZE2048
voidprintusage(char*command)
{
if(NULL==command)
exit(-1);
fprintf(stderr,"theuseageof%s:
",command);
fprintf(stderr,"%sIPADDR\n",command);
return;
}
intmain(intargc,char**argv)
{
intsockfd;
intlength;
structsockaddr_inserver;
intsndnum;
intrecvnum;
charsendbuf[BUFSIZE];
charrecvbuf[BUFSIZE];
sockfd=-1;
length=0;
if(2!
=argc)
{
printusage(argv[0]);
return-1;
}
if(-1==(sockfd=socket(AF_INET,SOCK_DGRAM,0)))
{
perror("createsocketerror\n");
return-1;
}
memset(&server,0,sizeof(structsockaddr));
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr(argv[1]);
server.sin_port=htons(PORT);
while
(1)
{
fprintf(stderr,"UDP>");
memset(recvbuf,0,BUFSIZE);
memset(sendbuf,0,BUFSIZE);
fgets(sendbuf,BUFSIZE,stdin);
length=strlen(sendbuf);
sendbuf[length-1]='\0';
sndnum=strlen(sendbuf);
if(0>sendto(sockfd,sendbuf,sndnum,0,(structsockaddr*)&server,sizeof(structsockaddr)))
{
perror("senderror\n");
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,(structsockaddr*)&server,&length)))
{
perror("readerror\n");
close(sockfd);
exit(-1);
}
recvbuf[recvnum]='\0';
fprintf(stderr,"theresult:
\n");
fprintf(stderr,"%s\n",recvbuf);
}
}
数据记录
和计算
详细见上面
结论
(结果)
使用套接字能实现远程控制,且有TCP和UDP两种形式。
小结
通过本实验,我掌握了:
1)进一步熟悉了Linux下C语言程序开发的过程;
2)进一步了解Socket网络编程,巩固了对UDP和TCP编程;
3)了解了远程控制的原理;
4)学会了使用数据报套接字来实现远程控制;
目前我存在的问题有:
套接字的函数比较繁琐,掌握的不是很熟练。
指导老师评议
成绩评定:
指导教师签名:
实验报告说明
专业实验中心
实验名称要用最简练的语言反映实验的内容。
如验证某程序、定律、算法,可写成“验证×××”;分析×××。
实验目的目的要明确,要抓住重点,可以从理论和实践两个方面考虑。
在理论上,验证定理、公式、算法,并使实验者获得深刻和系统的理解,在实践上,掌握使用实验设备的技能技巧和程序的调试方法。
一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。
实验环境实验用的软硬件环境(配置)。
实验内容(算法、程序、步骤和方法)这是实验报告极其重要的内容。
这部分要写明依据何种原理、定律算法、或操作方法进行实验,要写明经过哪几个步骤。
还应该画出流程图(实验装置的结构示意图),再配以相应的文字说明,这样既可以节省许多文字说明,又能使实验报告简明扼要,清楚明白。
数据记录和计算指从实验中测出的数据以及计算结果。
结论(结果)即根据实验过程中所见到的现象和测得的数据,作出结论。
小结 对本次实验的体会、思考和建议。
备注或说明可写上实验成功或失败的原因,实验后的心得体会、建议等。
注意:
∙实验报告将记入实验成绩;
∙每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。