第四次实验.docx
《第四次实验.docx》由会员分享,可在线阅读,更多相关《第四次实验.docx(12页珍藏版)》请在冰豆网上搜索。
![第四次实验.docx](https://file1.bdocx.com/fileroot1/2022-12/7/52590e1b-8ef4-4157-af35-ea0602b67f18/52590e1b-8ef4-4157-af35-ea0602b67f181.gif)
第四次实验
软件学院
信息安全产品开发实践实验四报告
陈枝-1043111034
2012-09-30
四川大学计算机学院、软件学院
实验报告
学号:
_1043111034_姓名:
_陈枝_专业:
_软件工程_班级:
_3班_第四周
课程名称
信息安全产品开发实践
实验课时
1
实验项目
远程控制系统
实验时间
第四周
2012年9月27日星期五
2012年9月30日星期天
实验目的
熟悉:
•流套接字与数据报套接字回顾
•远程控制系统流程
实验环境
X86,WindowsXP,VMware5.0,RedHatLinux9.0
实验内容(算法、程序、步骤和方法)
利用流套接字实现一个简单的远程控制系统:
1.客户端输入“quit”,客户端程序与服务器端程序打印退出信息,终止程序的执行;
2.客户输入命令,客户端将命令通过流套接字发送给客户端,服务器执行收到的命令,并将结果发送到客户端显示;
3.如果没有客户输入的命令,服务器发送命令非法信息,并在客户端显示该条信息。
编写实验报告:
1.列出程序运行状态、截图、配文字说明;
2.独立完成,打印报告,报告语言为中文,不少于4页A4,封面上书写姓名、学号。
数据记录
和计算
TCP套接字编程(cont.):
工作原理:
•客户端接收用户输入的命令,客户端通过套接字将命令传送给服务器端,
•服务器在收到用户的命令,对命令进行解析
•在服务器端调用对应的命令
•
并将命令执行的结果发送给客户端,从而实现远距离控制的功能。
程序源码:
tcpclient.c
#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_STREAM,0)))
{
perror("createsocketerror\n");
return-1;
}
memset(&server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=inet_addr(argv[1]);
server.sin_port=htons(PORT);
if(-1==connect(sockfd,(structsockaddr*)&server,sizeof(server)))
{
perror("connecterror\n");
close(sockfd);
return-1;
}
while
(1)
{
fprintf(stderr,"TCP>");
memset(recvbuf,0,BUFSIZE);
memset(sendbuf,0,BUFSIZE);
fgets(sendbuf,BUFSIZE,stdin);
length=strlen(sendbuf);
sendbuf[length-1]='\0';
if(0>=(sndnum=write(sockfd,sendbuf,strlen(sendbuf))))
{
perror("senderror\n");
close(sockfd);
exit(-1);
}
if(0==strcmp(sendbuf,"quit"))
{
fprintf(stderr,"quit...\n");
close(sockfd);
exit(0);
}
if(0>=(recvnum=read(sockfd,recvbuf,BUFSIZE)))
{
perror("readerror\n");
close(sockfd);
exit(-1);
}
recvbuf[recvnum]='\0';
fprintf(stderr,"theresult:
\n");
fprintf(stderr,"%s\n",recvbuf);
}
}
tcpserver.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;
/*Thefirststage:
INITILIZE*/
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;
/*Thesecondstage:
createlistensocket*/
if(-1==(sockfd=socket(AF_INET,SOCK_STREAM,0)))
{
perror("createsocketerror\n");
return-1;
}
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
/*Thethirdstage:
bindsocket*/
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(server)))
{
perror("bindsocketerror\n");
close(sockfd);
return-1;
}
/*Thefourthstage:
listensocket*/
if(-1==listen(sockfd,10))
{
perror("listensocketerror\n");
close(sockfd);
return-1;
}
/*Thefifthstage:
creatconnectsocket*/
while
(1)
{
if(-1==(conn_sock=accept(sockfd,(structsockaddr*)&client,&length)))
{
perror("threeshakehandserror\n");
close(sockfd);
return-1;
}
/*thecommnicationwithclient*/
while
(1)
{
memset(recvbuf,0,BUFSIZE);
memset(sendbuf,0,BUFSIZE);
if(0>=(recvnum=read(conn_sock,recvbuf,BUFSIZE)))
{
perror("thecommucationerror\n");
close(conn_sock);
close(sockfd);
return-1;
}
recvbuf[recvnum]='\0';
fprintf(stderr,"thecommandis:
%s\n",recvbuf);
if(0==strcmp(recvbuf,"quit"))
{
fprintf(stderr,"theclientisquit\n");
close(conn_sock);
break;
}
if(1>=(cnt=execute(recvbuf,sendbuf)))
{
sprintf(sendbuf,"theinvalidcommand,pleasetryagain\n");
}
fprintf(stderr,"theresultis\n%s",sendbuf);
if(0>=(sendnum=write(conn_sock,sendbuf,strlen(sendbuf))))
{
perror("thecommucationerror\n");
close(sockfd);
close(conn_sock);
return-1;
}
}
}
close(sockfd);
}
Makefile:
结论
(结果)
结果截图:
服务器端:
客户端:
小结
通过本实验,我掌握了:
利用流套接字实现一个简单的远程控制系统,熟悉了流套接字与数据报套接字编程。
自己能做一个简单的远程控制系统流程。
指导老师评议
成绩评定:
指导教师签名: