h〉
#include
#include
#include〈sys/socket。
h>
#include〈netinet/in。
h>
#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
#includeh〉
#include〈stdlib。
h〉
#includeh>
#include〈sys/types。
h>
#includeh〉
#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)学会了使用数据报套接字来实现远程控制;
目前我存在的问题有:
套接字的函数比较繁琐,掌握的不是很熟练。
指导老师评议
成绩评定:
指导教师签名:
实验报告说明
专业实验中心
实验名称要用最简练的语言反映实验的内容。
如验证某程序、定律、算法,可写成“验证×××";分析×××。
实验目的目的要明确,要抓住重点,可以从理论和实践两个方面考虑。
在理论上,验证定理、公式、算法,并使实验者获得深刻和系统的理解,在实践上,掌握使用实验设备的技能技巧和程序的调试方法.一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。
实验环境实验用的软硬件环境(配置).
实验内容(算法、程序、步骤和方法)这是实验报告极其重要的内容.这部分要写明依据何种原理、定律算法、或操作方法进行实验,要写明经过哪几个步骤.还应该画出流程图(实验装置的结构示意图),再配以相应的文字说明,这样既可以节省许多文字说明,又能使实验报告简明扼要,清楚明白。
数据记录和计算指从实验中测出的数据以及计算结果.
结论(结果)即根据实验过程中所见到的现象和测得的数据,作出结论。
小结 对本次实验的体会、思考和建议。
备注或说明可写上实验成功或失败的原因,实验后的心得体会、建议等。
注意:
∙实验报告将记入实验成绩;
∙每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。