Linux下基于TCP的预先派生子进程服务器的Socket编程_第1页
Linux下基于TCP的预先派生子进程服务器的Socket编程_第2页
Linux下基于TCP的预先派生子进程服务器的Socket编程_第3页
Linux下基于TCP的预先派生子进程服务器的Socket编程_第4页
Linux下基于TCP的预先派生子进程服务器的Socket编程_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

于先派子进服务的程描述/器模见的——于并。于回射服务序础实多务器模,到原户服务交问了客序计实功能的户序发以及子进。装的上分别进行客户程序和器程序测实验在的TCP中,相预子进程的性间都明改/模式的Socket网络编具定指。关:;TCP;子进;程中号:SocketProgrammingServerLinuxHeYanlong(CollegeInformationEngineering,TaiyuanTechnology,TaiYuan030024)papercommonserver—TCP-basedserver.InaTCP-basedserverprogramserverapplications,consideringofinteractionimprovedclientprogramserverpre-forkingserver.ClientserverprogramsLinuxrespectively.Theresultsinteractionclient,comparedserver,performanceofserverdramatically.ItcertainsignificanceinSocketprogrammingonmodel.0引言近来操系统的应为热Linux作个开操系统因核率高好和优点以强网功能,应用中得到了极大的发展。在因特网的发展日益广泛和深入的今天,面对着用户的巨大访问量和复杂的网络环境,如何设计效率高、稳定性好、安全性强的客/服务器成为了一个很有意义的议题。1客户/服务器模型在设计客户/服务器程序时,必须在两种类型的交互中做出选择:无连接的风格或面向连接的风格。[1]这两种风格的交互直接对应于协议族所提供的两个主要的传输协议。如果客户和服务器使用UDP)进行通信,那么交互就是无连接的;如果使用传输控制协议(TCP),则交互就是面向连接的。面向连接风格的交互协议使编程更简单,程序更可靠,因此采用协议的客户/服务器模型是我们的首选。服务器可以分为两种类型:一种是循环服务器(server),另一种是并发服务器(concurrentserver)[2]。循环服务器描述在一个时刻只处理一个请求的一种服务器实现。并发服务器描述一个时刻可以处理多个请求的一种服务器。本文讨论的是基于TCP协议的并发服务器。事实上,这是一种较常见的服务器类型,用于对个请求进行量处理,是要求有可靠的传输。2基于TCP协议的Socket编程TCP协议中常用的socket类型有种[3]:接(SOCK_STREAM),数据报接(SOCK_DGRAM),有序分接(SOCK_SEQPACKET,接(SOCK_RAW)。socket是一种面向连的socket,对应于面向连接的服务应用。接的服务器进程和客户进程在通信必须连接,连接和通信的如1所:l)服务进程首用socket()一个接,并用()服务器在接上,接着用listen()连接请求,用()做好客户进程连接的,无连接请求时,服务进程2)客户进程用()接,用connect()向服务进程发出连接请求;3)连接请求到,服务进程,成一个的接,并用接客户进程的接连接,服务进程成的接则用于网;write;1TCP/Fig.1TheflowdiagramofTCP-basedC/Stransmission3/3.1TCP2TCPFig.2TCP-basedechoserver/Web2,TCPSocketreadwrite三操作面三ssize_twriten(intfiledes,constvoid*buff,size_tnbytes);writen次buffnbytes描述符ssize_treadn(intfiledes,constvoid*buff,size_tnbytes);readn次描述符nbytesbuffssize_treadline(intfiledes,void*buff,size_tmaxlen);readline次描述符取maxlenbuff存两问题首先被阻塞等待期间看诸关闭等网事其次它-等模式运作批处理效率低样循环select使得够等待期间得网事知使shutdown解决批处理效率低问题然而实际般都循环事实每若干生若干次角度考虑研究存若干每与生若干次3.2算法每次运指定地址、、由户的子进程数(以允许客户并发的向同一个服务器发起多个连接)nchildren、每个子进程发送给服务器的请求数nloops以及每个请求要求服务器返送的数据字节数nbytes。父进程调用fork派生指定个数的子进程,每个子进程再与服务器建立指定次数的连接。每次建立连接后,子进程就在该连接上向服务器发送一行文本,指出需要由服务器返回多少字节的数据,然后在该连接上读入这个数量的数据,最后关闭该连接。父进程只是调用wait等待所有子进程都终止。客户程序的原理如图所示。TCP客户调用子进程的程序如下:for(i=0;i<nchildren;i++){if((pid=fork())==0){/*子进程for(j=0;j<nloops;j++){fd=tcp_connect(argv[1],argv[2]);write(fd,request,strlen(request));if((n=readn(fd,reply,nbytes))!=nbytes)err_quit("serverreturned%dbytes",n);close(fd);}printf("child%ddone\n",i);exit(0);}图3多进程并发服务器流程图Fig.3Theflowdiagramofmulti-processconcurrentserver3.3服务器算法3.3.1并发服务器传统上并发服务器调用fork派生一个子进程来处理每个客户。这使得服务器能够同时为多个客户服务,每个进程一个客户。并发服务器的问题在于为每个客户一个子进程比较耗费CPU时间。多进程并发服务器的流程如图所示。TCP并发服务器的main()函数调用子进程的程序如下:for(;;){clilen=addrlen;if((connfd=accept(listenfd,cliaddr,&clilen))<0){if(errno==EINTR)continue;elseerr_sys("accepterror");}if((childpid=fork())==0){/*子进程close(listenfd);/*关闭监听套接口*/web_child(connfd);/*处理请求exit(0);}close(connfd);/*父进程关闭套接口}3.3.2预先派生子进程服务器预先派生子进程服务器是通过预先派生子进程来实现的。预先派生子进[5]是让服务器在启动阶段调用fork创建一个子进程池。每个客户请求由当前可用子进程池中的某个(闲置)子进程处理(如图4所示)。客户1客户1子进程子进程子进程子进程...父进程可用子进程池图4预先派生子进程服务器流程图Fig.4Theflowdiagramofthepreforkingserver预先派生子进程服务器函数的调用子程序的程序如下:pids=calloc(nchildren,sizeof(pid_t));for(i=0;i<nchildren;i++)pids[i]=child_make(i,listenfd,addrlen);派生各个子进程的chli_make函数:pid_tchild_make(inti,intlistenfd,intaddrlen){pid_tpid;voidchild_main(int,int,int);if((pid=fork())>0)return(pid);/*父进程child_main(i,listenfd,addrlen);}每个子进程执行的无限循环的clild_main函数:voidchild_main(inti,intlistenfd,intaddrlen){intconnfd;voidweb_child(int);socklen_tclilen;structsockaddr*cliaddr;cliaddr=malloc(addrlen);printf("child%ldstarting\n",(long)getpid());for(;;){clilen=addrlen;connfd=accept(listenfd,cliaddr,&clilen);web_child(connfd);/*处理请求close(connfd);}3.4程序的编译、测试和结果图户/服务器程序的性能测试Fig.TheperformancetestofC/Sprograms(1)在上使用gcc4.3.2[6]编译客户程序client.c和服务器程序serv01.c和生成可执行文件(并发客户程序)serv01(并发服务器程序),serv02(预先派生子进程服务器程序),然后在一台装有的上分别运行服务器程序的可执行文件和serv02。在另外两台装有的上运行客户程序如图所示)。(2)先在的终端上运行服务器程序:./serv01192.168.1.258888(192.168.1.25是服务器的地址,8888是端口号)然后分别两台的终端上运客户程序:88885500(是服务器的地址,8888是端口号,5是子进程数,是每个子程的连接数,4000是返回的节数)当客户程完成所有的交,在服务器的终端按”中断在终端得到用户时间和系统CPU时间。(3)先在上运行服务器程序./serv02192.168.1.2515(是服务器的地址,8888是端口号,15是预先派生进程数)然后分别两台上运行客户序./client192.168.1.25888855004000当客户程完成所有的交,在服务器的终端按”中断在终端得到用户时间和系统CPU时间。(4)重复(3)步骤,设置预先派生子进程为别进行测试。表1预先派生子进程并发服务器和并发服务器的性能比较Tab.1ofserverand服务器户户时(秒)系统CPU时间(秒)CPU时间(秒)client(192.168.1.9)3.592220.0880053.57222client(192.168.1.4)3.564220.0800053.54022serv01(192.168.1.25)均值3.567223.656225client(192.168.1.9)1.088070.0120001.08407client(192.168.1.4)1.160070.0280011.15207serv02(192.168.1.25)(预先派生子进程数为)均值1.121071.141071表先派生子进程数对预先派生子进程服务器的性能的影响Tab.2Theimpactofthenumberofpreforkingonpreforkingserver’sperformance服务器/客户服务器的预先派生子进程数用户CPU时间(秒)时间(秒)时间(秒)300.0081.268081.27608450.0160011.208071.224071600.0360021.144071.180072750.0280011.220081.248081900.016

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论