还剩16页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
四川大学计算机学院、软件学院实验报告学号_1043111034_姓名_陈枝_专业_软件工程_班级_3班_第九周课程名称 信息安全产品__实践实验课时2实验项目并发服务器
(一)实验时间实验目的服务器模型多进程服务器模型实验环境 X86,WindowsXP,VMware
5.0,RedHatLinux
9.0实验内容(算法、程序、步骤和方法)试验题目1自己编写程序实现远程控制系统中使用到函数popen功能;思路使用管道pipeintf_des
[2]函数(参数f_des
[0]用于读取管道,f_des
[1]用于向管道写入数据)通过管道实现父子进程间通讯;步骤创建管道;创建子进程;在父进程中关闭f_des
[1]使用wait操作与等待子进程,然后将管道中的数据读出打印显示;在子进程:关闭f_des
[0]将管道f_des
[1]与标准输出进行重定向(dup2f_des
[1]STDOUT_FILENO),然后调用execvp函数执行程序中接收到的命令;试验题目2修改远程控制服务器代码,使得服务器同时能够向多个用户提供服务数据记录和计算程序源码题目1FILE*mypopenchar*cmdchartype{intpipefd
[2];//管道描述符intpid_t;//进程描述符iftype!=rtype!=w{printfmyopenflagerror/n;returnNULL;}ifpipepipefd0//建立管道{printfmyopenpipecreateerror/n;returnNULL;}pid_t=fork;//建立子进程ifpid_t0returnNULL;if0==pid_t//子进程中......{iftype==r{closepipefd
[0];//此函数返回文件指针是用于读,因此,在子进程中应该将结果写入管道,//这样父进程返回的文件指针才能读,所以这里将读端关闭dup2pipefd
[1]STDOUT_FILENO;//exec函数的执行结果将会通过标准输出写到控制台上,//但这里我们不需要在控制台输出,而是需要将结果返回,因此将标准输出重定向到管道写端closepipefd
[1];}else{closepipefd
[1];dup2pipefd
[0]STDIN_FILENO;closepipefd
[0];}char*argv[]={cmdNULL};ifexecvpcmdargv0//用exec族函数执行命令returnNULL;}wait0;//等待子进程返回iftype==r{closepipefd
[1];returnfdopenpipefd
[0]r;//由于程序需要返回的参数是文件指针,因此需要用fdopen函数将描述符打开,其返回值为相应的文件指针}else{closepipefd
[0];returnfdopenpipefd
[1]w;}}题目2#includestdio.h#includestdlib.h#includestring.h#includesys/socket.h#includenetinet/in.h#includesys/types.h#includeunistd.h#definePORT__00#defineBUFSIZE2048voidpro__sschildintclientsoket;FILE*mypopenchar*cmdchartype{intpipefd
[2];//管道描述符intpid_t;//进程描述符iftype!=rtype!=w{printfmyopenflagerror/n;returnNULL;}ifpipepipefd0//建立管道{printfmyopenpipecreateerror/n;returnNULL;}pid_t=fork;//建立子进程ifpid_t0returnNULL;if0==pid_t//子进程中......{iftype==r{closepipefd
[0];//此函数返回文件指针是用于读,因此,在子进程中应该将结果写入管道,//这样父进程返回的文件指针才能读,所以这里将读端关闭dup2pipefd
[1]STDOUT_FILENO;//exec函数的执行结果将会通过标准输出写到控制台上,//但这里我们不需要在控制台输出,而是需要将结果返回,因此将标准输出重定向到管道写端closepipefd
[1];}else{closepipefd
[1];dup2pipefd
[0]STDIN_FILENO;closepipefd
[0];}char*argv[]={cmdNULL};ifexecvpcmdargv0//用exec族函数执行命令returnNULL;}wait0;//等待子进程返回iftype==r{closepipefd
[1];returnfdopenpipefd
[0]r;//由于程序需要返回的参数是文件指针,因此需要用fdopen函数将描述符打开,其返回值为相应的文件指针}else{closepipefd
[0];returnfdopenpipefd
[1]w;}}intexecutechar*com__ndchar*buf{FILE*fp;intcount;charcom__ndbuf
[2056];ifNULL==com__nd||NULL==buf{perrorcom__ndorbufisempty\n;return-1;}count=0;memsetcom__ndbuf02056;strcatcom__ndbufsh-c;strcatcom__ndbufcom__nd;fprintfstderrthecom__ndis%s\ncom__ndbuf;charar=r;ifNULL==fp=mypopencom__ndbufar{perrorcreatepipeerror\n;return-1;}whilecount2047EOF!=buf[count++]=fgetcfp;buf[count-1]=\0;returncount;}int__in{intsockfd;structsockaddr_inclient;structsockaddr_inserver;intopt;intcnt;intaddr_len=sizeofclient;/*Thefirststage:INITILIZE*/memsetclient0sizeofclient;memsetserver0sizeofserver;sockfd=-1;opt=SO_REUSEADDR;/*Thesecondstage:createlistensocket*/if-1==sockfd=socketAF_INETSOCK_STREAM0{perrorcreatesocketerror\n;return-1;}setsockoptsockfdSOL_SOCKETSO_REUSEADDRoptsizeofopt;/*Thethirdstage:bindsocket*/server.sin_family=AF_INET;server.sin_addr.s_addr=htonlINADDR_ANY;server.sin_port=htonsPORT;if-1==bindsockfdstructsockaddr*serversizeofserver{perrorbindsocketerror\n;closesockfd;return-1;}iflistensockfd50{perrorlistensocketerror\n;exit1;}/*Thefifthstage:creatconnectsocket*/while1{intclientsocket;clientsocket=ac__ptsockfdstructsockaddr*clientsocklen_t*addr_len;ifclientsocket0{perrorerror:ac__ptclientsocket!!\n;continue;}intpid=fork;ifpid0{closeclientsocket;continue;}elseifpid==0{closesockfd;pro__sschildclientsocket;exit0;}else{printferror:forkchildpro__ss!!;}}closesockfd;}voidpro__sschildintclientsocket{charbuffer[BUFSIZE];intiDatanum;intcnt;charsendbuf[BUFSIZE];intsendnum;while1{iDatanum=recvclientsocketbufferBUFSIZE0;if0iDatanum{perrorerror:Recvdata!!;exit0;}buffer[iDatanum]=\0;fprintfstderrthecom__ndis:%s\nbuffer;if0==strcmpbufferquit{fprintfstderrtheclientisquit\n;closeclientsocket;exit0;}if1=cnt=executebuffersendbuf{sprintfsendbuftheinvalidcom__ndpleasetryagain\n;}fprintfstderrtheresultis\n%ssendbuf;if0=sendnum=writeclientsocketsendbufstrlensendbuf{perrorthecommucationerror\n;closeclientsocket;exit0;}}closeclientsocket;}结论(结果)结果截图:小结通过本实验,我掌握了服务器模型种类以及多进程服务器模型;并发服务模型在linux中提供了三种方式支持并发模型多进程,多线程,I/O多路复用;自己编写程序实现远程控制系统中使用到函数popen功能;自己还学会修改远程控制服务器代码,使得服务器同时能够向多个用户提供服务指导老师评议成绩评定指导教师签名。