第四次实验Word下载.docx
《第四次实验Word下载.docx》由会员分享,可在线阅读,更多相关《第四次实验Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
![第四次实验Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/7/52590e1b-8ef4-4157-af35-ea0602b67f18/52590e1b-8ef4-4157-af35-ea0602b67f181.gif)
实验目的
熟悉:
•流套接字与数据报套接字回顾
•远程控制系统流程
实验环境
X86,WindowsXP,VMware5.0,RedHatLinux9.0
实验内容(算法、程序、步骤和方法)
利用流套接字实现一个简单的远程控制系统:
1.客户端输入“quit”,客户端程序与服务器端程序打印退出信息,终止程序的执行;
2.客户输入命令,客户端将命令通过流套接字发送给客户端,服务器执行收到的命令,并将结果发送到客户端显示;
3.如果没有客户输入的命令,服务器发送命令非法信息,并在客户端显示该条信息。
编写实验报告:
1.列出程序运行状态、截图、配文字说明;
2.独立完成,打印报告,报告语言为中文,不少于4页A4,封面上书写姓名、学号。
数据记录
和计算
TCP套接字编程(cont.):
工作原理:
•客户端接收用户输入的命令,客户端通过套接字将命令传送给服务器端,
•服务器在收到用户的命令,对命令进行解析
•在服务器端调用对应的命令
•
并将命令执行的结果发送给客户端,从而实现远距离控制的功能。
程序源码:
tcpclient.c
#include<
stdio.h>
stdlib.h>
string.h>
sys/types.h>
sys/socket.h>
netinet/in.h>
#definePORT8900
#defineBUFSIZE2048
voidprintusage(char*command)
{
if(NULL==command)
exit(-1);
fprintf(stderr,"
theuseageof%s:
"
command);
%sIPADDR\n"
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"
);
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)))
connecterror\n"
close(sockfd);
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"
exit(0);
=(recvnum=read(sockfd,recvbuf,BUFSIZE)))
readerror\n"
recvbuf[recvnum]='
theresult:
\n"
%s\n"
recvbuf);
tcpserver.c
intexecute(char*command,char*buf)
FILE*fp;
intcount;
charcommandbuf[2056];
if((NULL==command)||(NULL==buf))
commandorbufisempty\n"
count=0;
memset(commandbuf,0,2056);
strcat(commandbuf,"
sh-c"
strcat(commandbuf,command);
thecommandis%s\n"
commandbuf);
if(NULL==(fp=popen(commandbuf,"
r"
)))
createpipeerror\n"
while((count<
2047)&
&
(EOF!
=(buf[count++]=fgetc(fp))));
buf[count-1]='
returncount;
intmain()
intconn_sock;
intsendnum;
structsockaddr_inclient;
intopt;
intcnt;
/*Thefirststage:
INITILIZE*/
client,0,sizeof(client));
memset(sendbuf,0,BUFSIZE);
memset(recvbuf,0,BUFSIZE);
conn_sock=-1;
opt=SO_REUSEADDR;
/*Thesecondstage:
createlistensocket*/
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&
opt,sizeof(opt));
/*Thethirdstage:
bindsocket*/
server.sin_addr.s_addr=htonl(INADDR_ANY);
server.sin_port=htons(PORT);
if(-1==bind(sockfd,(structsockaddr*)&
bindsocketerror\n"
/*Thefourthstage:
listensocket*/
if(-1==listen(sockfd,10))
listensocketerror\n"
/*Thefifthstage:
creatconnectsocket*/
if(-1==(conn_sock=accept(sockfd,(structsockaddr*)&
client,&
length)))
threeshakehandserror\n"
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]='
thecommandis:
if(0==strcmp(recvbuf,"
fprintf(stderr,"
theclientisquit\n"
break;
if(1>
=(cnt=execute(recvbuf,sendbuf)))
sprintf(sendbuf,"
theinvalidcommand,pleasetryagain\n"
theresultis\n%s"
sendbuf);
=(sendnum=write(conn_sock,sendbuf,strlen(sendbuf))))
close(sockfd);
Makefile:
结论
(结果)
结果截图:
服务器端:
客户端:
小结
通过本实验,我掌握了:
利用流套接字实现一个简单的远程控制系统,熟悉了流套接字与数据报套接字编程。
自己能做一个简单的远程控制系统流程。
指导老师评议
成绩评定:
指导教师签名: