当前位置:文档之家› 远程控制系统

远程控制系统

四 川 大 学 计 算 机 学 院、软 件 学 院 实 验 报 告

课程名称 信息安全产品开发实践 实验课时 5

实验项目 远程控制系统 实验时间 2011年9月22号

实验目的

1) 继续了解Linux下C语言程序开发的过程 2) 继续了解Socket网络编程 3) 回顾流套接字与数据报套接字 4) 了解远程控制系统的流程及其实现的两种方式(TCP和UDP)

实验环境 VMware5.0,RedHat Linux 9.0

实验内容(算法、程序、步骤和方法)

• 利用数据报套接字实现一个简单的远程控制系统: 1.客户端输入“quit”,客户端程序与服务器端程序打印退出信息,终止程序的执行;

2.客户输入命令,客户端将命令通过流套接字发送给客户端,服务器执行收到的命令,并将结果发送到客户端显示;

3.如果没有客户输入的命令,服务器发送命令非法信息,并在客户端显示该条信息。

4.编写实验报告: 列出程序运行状态、截图、配文字说明; 在进行试验之前先来回顾一下UDP套接字编程的流程:

上图反应了在进行数据报套接字编程时服务器端和客户端需要做得工作,从中我们可以看出服务器端需要经过五个步骤,而客户端只需要四个步骤。

远程控制的原理如下: • 客户端接收用户输入的命令,客户端通过套接字将命令传送给服务器端, • 服务器在收到用户的命令,对命令进行解析 • 在服务器端调用对应的命令 • 并将命令执行的结果发送给客户端,从而实现远距离控制的功能。

从远程控制的原理并结合UDP套接字编程的流程我们可以画出用UDP实现远程控制的流程图,如下: 下面介绍本试验的具体步骤: (1):打开虚拟机,在Linux下的VI编辑器中编写服务器端程序UDPserver.c (2)使用命令gcc –o UDPserver UDPserver.c –g编译; (接上) 实验内容(算法、程序、步骤和方法)

(3):编写客户端程序:UDPclient.c (4): 使用gcc –o UDPclient UDPclient.c –g命令编译 (5)使用setup命令配置虚拟机的IP地址为10.0.0.222 (6):执行服务器端代码(./UDPserver),客户端连接服务器(./UDPclient 10.0.0.22): (6):客户端输入字符串ls,服务器端解析输出结果: (7):客户端继续输入字符串who,how,服务器端解析输出结果 (8):客户端输入quit命令,断开连接,服务器正确反应,与客户端脱离连接 附试验源代码:

UDPserver.c #include #include #include #include #include #include

#define PORT 8900 #define BUFSIZE 2048 int execute(char*command,char*buf) { FILE *fp; int count; char commandbuf[2056];

if ((NULL==command)||(NULL==buf)) { perror("command or buf is empty\n"); return -1; } count =0; memset(commandbuf,0,2056); strcat(commandbuf,"sh -c "); strcat(commandbuf,command); fprintf(stderr,"the command is %s\n",commandbuf);

if (NULL==(fp=popen(commandbuf,"r"))) { perror("create pipe error\n"); return -1; } while ((count<2047) && (EOF!=(buf[count++]=fgetc(fp)))); buf[count-1]='\0'; return count; }

int main() { int sockfd; int conn_sock; char sendbuf[BUFSIZE]; char recvbuf[BUFSIZE]; int sendnum; int recvnum; int length; struct sockaddr_in client; struct sockaddr_in server; int opt; int cnt; int lens;

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("Create socket error\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,(struct sockaddr*)&server,sizeof(struct sockaddr)))

{ perror("bind socket error\n"); 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("the commucation error\n"); close(sockfd); return -1; } recvbuf[recvnum]='\0';

fprintf(stderr,"the command is:%s\n",recvbuf); if (0==strcmp(recvbuf,"quit")) { fprintf(stderr,"the client is quit\n"); break; }

if (1>=(cnt=execute(recvbuf,sendbuf))) { sprintf(sendbuf,"the invalid command,please try again\n");

} fprintf(stderr,"the result is \n%s",sendbuf); sendnum=strlen(sendbuf); lens=sizeof(struct sockaddr); if (0>=sendto(sockfd,sendbuf,sendnum,0,(struct sockaddr*)&client,lens))

{ perror("the commucation error\n"); close(sockfd); return -1;

} } } close(sockfd); } UDPclient.c #include #include #include #include #include #include #include

#define PORT 8900 #define BUFSIZE 2048

void printusage(char*command) { if (NULL==command) exit(-1);

fprintf(stderr,"the useage of %s :",command); fprintf(stderr,"%s IPADDR\n",command); return; }

int main(int argc,char** argv) { int sockfd; int length;

相关主题