《Linux下基于TCP的预先派生子进程服务器的Socket编程.pdf》由会员分享,可在线阅读,更多相关《Linux下基于TCP的预先派生子进程服务器的Socket编程.pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第1 9 卷第3 期电子设计工程2 0 11 年2 月V 0 1 19N o 3E l e c t r o n i t D e s i g nE n g i n e e r i n gF e b 2 01 1L i n u x 下基矛T C P 的预先派生子进程服务器的S o c k e t 编程和家强刘彦隆(太原理工大学信息工程学院,山西太原0 3 0 0 2 4)摘要:描述了客户J l 务器模型以及常见的服务器类型基于T C P 的并发服务器。在一个基于T C P 回射服务器程序的基础上。结合实际W e b 应用中的多进程服务器模型。考虑到原有的客户,服务器交互存在的问题,改进了客户程序设
2、计了实现并发功能的客户程序、并发服务嚣以及预先派生子进程服务器。在装有L i n u x 的P C 上分别进行客户程序和服务器程序的测试。实验结果表明:在与并发客户的T c P 交互中。与并发服务器相比,预先派生子进程服务器能够及时处理新的客户连接,且响应时间减小到并发服务器的三分之一,达到了对服务器性能优化的目的。关键词:S o c k e t;T C P;预先派生子进程;多进程中图分类号:T P 3 9 3 0 9文献标识码:A文章编号:1 6 7 4 6 2 3 6(2 0 1 1)0 3-0 1 4 3 埘S o c k e tp r o g r a m m i n go fp r e
3、 f o r k i n gs e r v e rb a s e do nT C Pi nL i n u xH EJ i a-q i a n g,L I UY a n l o n g(c o 如驴o f I n f o r m a t i o nE n g i n e e r i n g,T a i y u a nU n i v e r s i t yo f T e c h n o l o g y,T a i y u a n0 3 0 0 2 4,C h i n a)A b s t r a c t:T h i sp a p e rd e s c r i b e dt h eC Sm o d e
4、 la n dt h ec o m m o n 鸵r v e rt y p e-T C P b a s e dc o n c u r r e n t r v e r I naT C P-b a s e de c h o r v e rp r o g r a m。c o m b i n i n gw i t ht h ep r a c t i c a lm o d e lo fm u l t i p r o c e s ss e r v e ri nW e ba p p l i c a t i o n s,a n dc o n s i d e r i n gt h ep r o b l e m
5、so fo r i g i n a lC Si n t e r a c t i o np r o c e s s,i ti m p r o v e dt h ec l i e n tp r o g r a ma n dd e s i g n e dt h ec o n c u r r e n tc l i e n t,c o n c u r r e n ts e r v e ra n dp r e f o r k i n gs e r v e r C l i e n ta n ds e r v e rp r o g r a m sr a no nP C sw i t hL i n u xr e
6、 s p e c t i v e l y T h er e s u l t ss h o w e dt h a ti nt h ei n t e r a c t i o nw i t ht h eT C P-b a s e dc l i e n t,c o m p a r e dw i t ht h ec o n c u r r e n t 鸵r v e r。t h ep r e f o r k i n gs e r v e rp r o c e s s e dn e wc l i e n tc o n n e c t i o n st i m e l ya n dt h er e s p o
7、 n s et i m eo fi tr e d u c e dt oo n et h i r do fi t sc o u n t e r p a r t,a n dt h i sr e a l i z e dt h eo p t i m i z a t i o no ft h e8 e r v e r g sp e r f o r m a n c e K e yw o r d s:S o c k e t;T C P;p r e f o r k i n g;m u l t i-p r o c e s s近年来L i n u x 操作系统的应J H 成为热点,而L i n u x 作为一个开源
8、的操作系统因为其内核小、效率高、兼容性好和稳定性强等优点以及强大的网络服务功能,在网络应用中得到了极大的发展。在闪特网的发展f】益广泛和深入的今天。面对着J H 户的f i 大访口J 蛙和复杂的网络环境如何设计效率高、稳定性好、安全性强的客户,服务器成为了一个很有意义的议题。1客户h i 务器模型在设计客户,服务器程h 时。必须在2 种类剖的交互中做出选择:无连接的风格或面向连接的风格I I。这两种风格的交互A 接对应于T C P I P 协议族所提供的2 个主要的传输协议。如果客户和服务器使川J 1 I 户数据报(U I)P)进行通信那么交互就是无连接的:如果使川传输控制协议(T C P),
9、则交瓦就是面向连接的。面向连接J x l 格的交巨仇议使编秤更简单。程序更n r 靠收稿日期:2 0 1 0 0 9 0 8稿件编号:2 0 1 0 0 9 0 1 5因此采用T C P 协议的客户l l g 务器模型是我们的首选。服务器可以分为2 种类型:循环服务器(i t e r a t i v e l v e r)和并发服务器(c o n c u r r e n ts e r v e r)t 2 I。循环服务器描述在一个时刻只处理一个请求的一种服务器实现。并发服务器描述一个时刻可以处理多个请求的一种服务器。本文讨论的是基于T C P 协议的并发服务器。事实上这是一种较常见的服务器类型它适
10、用于对每个请求进行少量处理但是要求有百r 靠的传输。2基于T C P 协议的S o c k e t 编程T C P 协议中常H j 的s o c k e t 类型共有4 种1 3 I:字节流套接口(S O C K S T R E A M)数据报套接口(S O C K D G R A M)有序分组套接口(S O C K _ S E Q P A C K E T)和原始套接口(S O C K R A W)。流式s o c k e t 是一种面向连结的s o c k e t 对应于面向连接的T C P 服务应用。字竹流套接口的服务器进程和客户进程在通信前必须先建立连接,建立连接和通信的步骤如图l 所示
11、。作者简介:和家强(1 9 8 4 一)。男江苏南京人硕士研究生。研究方向:嵌入式系统网络传输技术。1 4 3-万方数据电子设计工程)2 0 1 1 年第3 期众所周知端T C P 客户茹五百m连柽建立(T C P=路挥)蔬百广静墨!炒!竖查墨述符f i l e d e s 中。s O C k“i)I-|一直阻寒到吝尸连拯到达飘 丽If l t e J 卜o二匕二 二二罔l基于T C P 的客户,服务器的传输流程图F i g 1T h ef l o wd i a g r a mo fT C P-b a s e dU St r a n s m i s s i o n1)服务进程首先调用s o c
12、 k e t()创建一个字节流套接口,并调用b i n d()将服务器地址捆扎在该套接口上,接着调用l i s t e n()监听连接请求,随后调用a c c e p t()做好与客户进程建立连接的准备,无连接请求时,服务进程被阻塞:2)客户进程调用s o c k e t()创建字节流套接口,然后调用c o n n e c t()向服务进程发出连接请求;3)当连接请求到来后,服务进程被唤醒,生成一个新的字节流套接门。并用新套接口同客户进程的套接口建立连接丽服务进程最早生成的套接门则继续用于监听网络上的服务请求;4)服务进程和客户进程通过调用r e a d()和w r i t e()交换数据:5
13、)服务进程和客户进程通过调用c l o s e()撤消套接口并中断连接。3 客户服务器的程序设计3 1 对基于T C P 的回射服务器的程序的改进客户,服务器交互情形在W e b 应用中是典型的:客户向服务器发送一个小请求,服务器响应以返回给客户的数据。以一个回射服务器(如图2 所示)为例这是基于T C P 协议的S o c k e t 编程,当从客户端输入文本时,可以从服务器返回刚才输入的文本。勰竺与砩:竺竺F 习f D u ts Il r e a d-r l t e II圈2T c P【1 射服务器F i g 2T C P b a s e de c h o8 e 1 v e r字节流套接口
14、上的r e a d 和w r i t e 函数所表现的行为不同于通常的文件I,o。字节流套接口上的读或者写输入的字节数可能比要求的数量少,但这不是错误状况原因是内核中套接口的缓冲区可能已达到了极限。为预防出现返回不足的字节计数值设计j P 以下3 个函数。当对字节流套接口进行读或写操作时调用下面的3 个函数:鸽i z e _ tw r i t e n(i n tf i l e d e s c o p,s tv o i d+b u f f,s i z etn b y t e s);w r i t e n 函数可以一次从b u f f 写入n b y t e s 个字节到文件描一1 4 4 一s
15、s i z e _ tr e a d n(i n tf i l e d e s,c o n s tv o i d+b u f f,s i z e jn b y t e s);r e a d n 函数可以一次从文件描述符f i l e d e s 读入n b y t e s 个字节到b u f f 中。船i z e _ tr e a d l i n e(i n tf d e d e s。v o i d u f f,s i z e _ tm a x l e n);r e a d l i n e 函数可以一次从文件描述符f d e d e s 中读取m a x l e n 字节的数据到b u 仃中。
16、对于回射服务器程序存在两个问题。首先,进程在被阻塞以等待用户输入期间。看不到诸如对端关闭连接等网络事件。其次,它以停一等模式运作批处理效率极低。对于这样的一个循环客户程序。可以通过调用s e l e c t 函数使得进程能够在等待用户输入期间得到网络事件通知。可以通过使用s h u t d o w n 函数解决批处理效率低下的问题。然而,实际的客户一般都不是循环客户。事实上,每个客户可能和若干个服务器发生若干次交互。本文从服务器的角度考虑,研究存在若干个客户,每个客户与一个服务器发生若f 次的交互的情况。3 2 客户算法客户程序设计:每次运行本客户程序时指定服务器的I P 地址、服务器的端口、
17、由客户f b r k 的子进程数(以允许客户并发的向同一个服务器发起多个连接)n e h i l d r e n、每个子进程发送给服务器的请求数n l o o p s 以及每个请求要求服务器返送的数据字节数n b y t e s。父进程调用f b r k 派生指定个数的子进程每个子进程再与服务器建立指定次数的连接。每次建立连接后,子进程就在该连接上向服务器发送一行文本,指出需要由服务器返回多少字节的数据,然后在该连接上读入这个数量的数据,最后关闭该连接。父进程只是调用w a i t 等待所有子进程都终止。T C P 客户调用子进程的程序如下:f o r(i=0;i n c h i l d r
18、e n;i+)i f(p i d=f o r k()一0)I严子进程+f o r(j=0;j n l o o p s;j+)If d=t o p _ c o n n e c t(a r g v 1 ,a r g v【2】);w r i t e(f d,r e q u e s t,s t r l e n(r e q u e s t);i f(n=r e a d n(f d。r e p l y,n b y t e s)!=n b y t e s)e r r _ q u i t(“弛r v e rr e t u r n e d db y t e s”,n);c l o s e(f d);p f i
19、n f f(“c h i l d dd o n e k n”,i);e x i t(O);3 3 服务器算法3 3 1 并发服务器传统上并发服务器调用f o r k 派生一个子进程来处理每羔忑慕王万方数据和家强,等L i n u x 下基于T C P 的预先派生子进程服务器的S o c k e t 编程个客户。这使得服务器能够I l j j 时为多个客户服务,每个进程一个客户。并发服务器的口】题在于为每个客户f o r k 一个子进程比较耗费C P U 时蚓。多进程并发服务器的流程如图3 所示。T C P 并发服务器的m a i n()函数调用子进程的程序如下:图3 多进程并发服务器流程陶F
20、i g 3 仆ef l o wd i a g r a mo fm u l t i-p r o c e s sc o n c u r r e n ts e r v e rf o r(;)c l i l e n=a d d r l e n;i f(c o n n f d=a c c e p t(1 i s t e n f d,c l i a d d r&e l i l e n)0)Ii f(e r m o=E I N T R)c o n|l n u e;e h ee n r _ s y s(“a c c e p te r r o r”);i f(c h i l d p i d=f o r k()=
21、0)f 严子进程+,c l o s e(1 i s t e n f d);p 关闭监听套接口+,w e b _ c h i l d(c o n n f d):p 处理请求,e x i t(O);Jc l o s e(c o n n f d);严父进程关闭套接口,l3 3 2 预先派生子进程服务器预先派生子进程服务器是通过预先派生子进程来实现的。预先派生子进程f q 是让服务器在启动阶段调用f o r k 创建一介子进程池。每个客户请求由当前町用子进程池巾的某个(闲置)子进程处理(如图4 所示)。罔4 预先派乍子进稃服务器流捍罔F i g 4T h ef l o wd i a g r a mo
22、ft h ep r e f o r k i n gs e r v e r预先派生子进程服务器m a i n 函数的调用子程序的程序如下:p i d s=c a l l o c(n c h i l d r e n s i z e o f(p i d _ t);f o r(i=0;i n c h i l d r e n;i+)p i d s|i】=c h i l d m a k e(i,l i s t e n f d,a d d r l e n);派生各个子进程的c h l i m a k e 函数:p i d _ tc h i l d m a k e(i n ti。i n ti i s t e
23、n f d,i n ta d d r l e n)每个子进程执行的无限循环的c l i l d m a i n 函数:v o i dc h i l d m a i n(i n tj,i n tl i s t e n f d,i n ta d d r l e n)3 4 程序的编译、测试和结果1)在L i n u x 上使用g c c 4 3 2 l q 编译客户程序c l i e n t C 和服务器程序s e r v O I e 和g e r v 0 2 c。生成町执行文件c l i e n t(并发客户程序),s e r v O l(并发服务器程序),鸵r v 0 2(预先派生子进程服务器
24、程序)。然后在一台装有L i n u x 的P C 上分别运行服务器程序的可执行文件s e r v O l 和I v 0 2。在另外两台装有L i n u x 的P C 上运行客户程序c l i e n t(如图5 所示)。图5 客户,服务器程序的性能测试F i g 5T h ep e r f o r m a n c et e s to fC Sp m g r a n 2)先在P C 的终端上运行服务器程序:s e r v O l1 9 2 1 6 8 1 2 58 8 8 8(1 9 2 1 6 8 1 2 5 是服务器的I P 地址。8 8 8 8 是端口号)然后分别在两台P C 的终端上
25、运行客户程序:一1 4 5-万方数据电子设计工程)2 0 1 1 年第3 期c l i e n t1 9 2 1 6 8 1 2 58 8 8 855 0 04 0 0 08 8 8 855 0 04 0 0 0(1 9 2 1 6 8 1 2 5 是服务器的I P 地址,8 8 8 8 是端口号,5 是当客户程序完成所有的T c P 交互。在服务器的终端按子进程数5 0 0 是每个子进程的T C P 连接数,40 0 0 是返回的“C r t l+C”中断,在终端得到用户C P U 时间和系统C P U 时间。字节数)4)重复3)步骤,设置预先派生子进程数为3 0,4 5,6 0,7 5,当
26、客户程序完成所有的T C P 交互,在服务器的终端按9 0,1 0 5,4 0 0,1 0 0 0 分别进行测试。“C r t l+C”中断在终端得到用户C P U 时问和系统C P U 时间。从表l 町以看出预先派生子进程服务器的每次I P 交3)先在P C 上运行服务器程序s e r v 0 21 9 2 1 6 8 1 2 58 8 8 81 5互的平均用户C P U 时间和平均系统C P U 时间都只有并发服(1 9 2 1 6 8 1 2 5 是服务器的I P 地址。8 8 8 8 是端口号,1 5 是务器的三分之一,服务器的响应时I H J 得到了大大地提高。从预先派生子进程数)表
27、2 可以得出这样的结论:随着预先派生子进程的增加,服然后分别在两台P C 上运行客户程序c l i e n t1 9 2 1 6 8 1 2 5务器的响应时间也在恶化。表l 预先派生子进程并发服务器和并发服务器的性能比较T a b 1P e r f o r m a n c ec o m p a r i s o no fp r e f o r k i n gs e r v e ra n dc o n c u r r e n ts e r v e r衰2 预先派生子进程数对预先派生子进程服务器的性能的影响T a b 2T h ei m p a c to ft h en u m b e ro fp
28、r e f o r k i n gO i lp r e f o r k i n gs e r v e r sp e r f o r m a n c e4 结论本文在基于T C P 的同射服务器的基础上面对字节流S o c k e t 的缓冲区和T C P 连接的交巨的f b l 题改进了客户程序实现了并发功能的客户以及并发服务器和预先派生子进程服务器。在与并发客户的T C P 交互中,与传统的并发服务一1 4 6 一器相比较预先派生子进程服务器能够及时的处理客户连接并把服务器的响应时间降低到并发服务器的三分之一,提高了服务器的性能。但是服务器还不能总是应对客户负载的变动。当可用子进程数低于某个
29、闭值时会恶化服务器的响应时间。这需要设计相应的算法持续监视町用的子进程数。(下转第1 4 9 页)万方数据王长元,等一种基于Q o s 区分对待请求任务的研究裹l 紧急指针字节定义T a b 1E m e r g e n c yp o i n t e rb y t e sd e f i n i t i o n位优先权第0 2 位第3 位第4 位第5 位第6 7 位优先权0=普通延迟。l=低延迟o=普通吞吐率1 _ 高吞吐率0=一般可靠性1=高可靠性标志位系列的操作使能将请求任务进行区分。设置优先级服务器才能根据优先级对请求人物进行区别对待,使请求任务的要求的服务质量得到保证。分类:采用分类方法
30、中对源I P 地址识别分辨出数据包产生哪种应用在3 次握手中第一次握手当服务器接收到数据包时候根据用户的I P 地址找到用户的相应信息判断用户的身份区分用户是否是付费用户,在服务器中分为付费队列和非付费队列通过区分用户身份将其放入相应的队列优先处理付费用户。然后解析分别对队列巾数据包巾的紧急指针由此判断出请求任务要求的服务质最要求,即要求服务器需要提供服务的一种能力包括专用带宽、抖动控制和延迟(用于实时和交互式流最情形)、丢包牢的改进以及不同W A N、L A N 和M A N 技术下的指定网络流域等同时确保为每种流量提供的优先权不会阻碍其它流量的进程。进行标志位标注:为了能让服务器对分类结果
31、能够别对待,必须时分类结果进行标注,所以必须在数据包里面加入标注位在分类结束之后根据分类结果对每个数据包进行标注按照数据包中紧急指针显示出的服务质量要求区别进行标注,服务质量要求越高的标志位越高。优先级设置:对数据包的标志位进行比较,根据标志位的大小。标志位越大优先级越高依照此原则进行优先级设置。最后使得服务质量要求越高的请求任务优先级越高,服务器处理请求任务时候也能根据优先级的大小进行处理真正做到别对待。2 5 处理请求任务当将请求任务区分完之后需要对请求任务区分对待。根据的嘣的结果需要服务器处理请求任务时候优先处理付费J H 户的队列再优先处理其中高优先级的请求任务,当付费用户的请求任务处
32、理完之后,再处理非付费用户的请求任务,同样也是优先处理其中高优先级的请求任务。3 结束语本文描述了如何让客户定义自己要求的服务质晟和如何利用Q o s 对服务器的请求任务进行区分。做到进行叹别对待,做了简单的设想。相比以前只有服务器资源得到比较有效利用,而客户的服务质垣要求得不到表达,还是有客户的请求任务得不到满足影响_ r 客户对服务器的信息,造成了损失。当今服务器面I I 缶的客户请求任务越来越多,如果能做到对各种服务质量要求的请求任务进行别对待用户义能够自己描述自己服务质量使服务器和客户都可以节省很多时间和资源。真正做到双赢。参考文献:【l】林闻,单志广,盛立杰,等I n t e r n
33、 e t 区分服务及其几个热点问题的研究【J】计算机报2 0 0 0,2 3(4):4 1 9-4 3 3 L I NC h u a n g,S H A NZ h i g u a n g,S H E N GL i-j i e e ta 1 D i f f e r e n t i a t e ds e r v i c e si nt h eI n t e r n e tf J l C h i n e s eJ o u r n a lo fC o m p u t e r s,2 0 0 0,2 3(4)4 1 9-4 3 3【2】A l o n s oG C a s a t iF,K u n oH
34、,e ta 1 W e bS e r v i c ee o n c e p t s【J】A r c h i t e c t u r e sa n dA p p l i c a t i o n s,B e r l i n:S p r i n g e r 2 0 0 4【3】R a nSP Am o d e lf o rW e bs e r v i c e sd i s c o v e r yw i t hQ o S I M A C MS I G e c o mE x c h a n g e s,2 0 0 3【4】Y uJ i a B u y y aR a j k u m a r,T h a m
35、C h e nK h o n g Q o Sb a s e ds c h e d u l i n go fw o r k f l o wa p p l i c a t i o n so ns e r v i c es r i d s【e l P r o c e e d i n g so ft h eIs tI E E Ei n t e r n a t i o n a lc o n f e r e n c eo ne S c i e n c ea n dg dc o m p u t i n gM e l b o u r n e,A u s t r a l i a,2 0 0 5【5】I T U
36、2 T I T U 2 T 2 R E C 2 X 6 41-19 9 7,I n f o r m a t i o nt e c h n o l o g yq u a l i t yo fs e r v i c e:f r a m e w o r k【S 1【S I 1:I T U 2 T,19 9 7【6】D O G A NA O Z G U N E RF O nQ o sb a s e ds c h e d u l i n go fam e t a t a s kw i t hm u l t i p l eQ o sd e m a n d si nh e t e r o g e n e o
37、 u sc o m p u t i n g【c V P m co fl n f lP a r a l l e la n dD i s t r i b u t e dP r o c e s s i n gS y m p o s i u m F o r tL a u d e r d a l e:I s n】,2 0 0 2(上接弟1 4 6 页)参考文献:【1】C o m e rDE 用T c M P 进行网际互联I M l I 卷林瑶,张娟王海等译北京:电子工业出版社2 0 0 7【2】C o m e rDE,S t e v e n sDL 用T c P,l P 进行网际互联【M 1 3卷赵刚,
38、林瑶,蒋慧。等,译北京:电子工业出版社,2 0 0 7【3 1S t e v e n sWR。R a g oSA U n i x 环境高级缡程【M】尤晋元。张亚英戚正伟,译北京:人民邮电出版社,2 0 0 6【4】R F C 8 6 2 E c h oP r o t o e o l l S 19 8 3【5 JS t e v e n sWR,R u d o f f AM U n i x 网络缟相t l m l 1 卷扬继张译北京:清华大学出版社,2 0 0 6【6 1 韦东山嵌入式L i n u x 应用开h i M 北京:人民邮电出版社锨)8 一1 4 9-万方数据Linux下基于TCP的预
39、先派生子进程服务器的Socket编程Linux下基于TCP的预先派生子进程服务器的Socket编程作者:和家强,刘彦隆,HE Jia-qiang,LIU Yan-long作者单位:太原理工大学,信息工程学院,山西,太原,030024刊名:电子设计工程英文刊名:ELECTRONIC DESIGN ENGINEERING年,卷(期):2011,19(3)参考文献(6条)参考文献(6条)1.韦东山 嵌入式Linux应用开发 20082.Stevens W R;Rudoff A M;杨继张 Unix 网络编程 20063.Echo Protocol 19834.Stevens W R;Rago S A;尤晋元;张亚英,戚正伟 Unix环境高级编程 20065.Comer D E;Stevens D L;赵刚;林瑶,蒋慧 用TCP/IP进行网际互联 20076.Comer D E;林瑶;张娟;王海 用TCP/IP进行网际互联 2007 本文链接:http:/