Linux网络编程之IO复用循环服务器

上传人:shug****ng1 文档编号:51506926 上传时间:2022-01-26 格式:DOCX 页数:7 大小:19.51KB
收藏 版权申诉 举报 下载
Linux网络编程之IO复用循环服务器_第1页
第1页 / 共7页
Linux网络编程之IO复用循环服务器_第2页
第2页 / 共7页
Linux网络编程之IO复用循环服务器_第3页
第3页 / 共7页
资源描述:

《Linux网络编程之IO复用循环服务器》由会员分享,可在线阅读,更多相关《Linux网络编程之IO复用循环服务器(7页珍藏版)》请在装配图网上搜索。

1、1、介绍在前几节,我们介绍了循环服务器,并发服务器、简单得循环服务器每次只能处理一个请求,即处理得请求就是串行得而并发服务器可以通过创建多个进程或者就是线程来并发得处理多个请求。 但由于进程或线程得切换会带来一定得开销。而且随着客户端请求得增多,创建得线程或进程得数 目也越来越多,开销势必会增加。因此,本文提出了1/O复用得循环服务器。I/O复用得循环服务器创建两个线程,一个就是客户端连接处理线程,专门用来处理客户端得连接,当有客户端到来 得时候,此线程把客户端得套接字描述符放到一块公共得区域中。另一个就是业务处理线程,此线 程轮循(s elec t )客户端套接字描述符集合中有没有数据到来,

2、如果有数据到来,那么就进行处理2、I/O复用循环服务器处理流程socket(、);bind (、);l is ten (、);p t hread_c r eate (、);pt h re ad_jo in(、);clo se(、); /关闭服务器套接字连接处理线程:while(1 )a cc e p t(、);s t or e (、); /存储客户端套接字描述符业务处理线程:whi 1 e(1 )g e t (、);/取出套接字描述符放到FD_ S ETs elec t (、);r ec v (、);process( 、);sen d(、);c 1 ose (、);从算法得主要流程可以瞧出,I

3、/O复用循环服务器只用两个线程,一个就是请求业务连接线程,专门处理连接。另一个就是业务处理线程,轮循客户端得套接字有没有数据。3、相关例子服务器;#i ncl u de s tdio、h ?#in cl u d e stri n g、h #i n clu d e st d l i b、h ? # in c lude v s ys /sock et、h ?#i ncl ud e v s y s/t ypes、h#i nclu de # in clud e #includ e pthre ad、h/* * ?I /O复用循环服务器I/O并发服务器随着客户端得增多,必须增加处理单元,系统得负载会移动

4、多个处理单元得切换上,切换进程或者就是线程而I /O复用服务器包括两个线程,一个就是业务连接线程,专门处理客户端得连接,另一个就是业 务请求处理线程,对多个客户端描述符进行一定时间得等待,即s elect监听多个描述符?* */#defi n e P O R T 8 88 8#d e f i n e C L IENTNUM 1 0 2 4?#de fin e B UFFERSI Z E 1024# def i ne BAC K LOG 10s ta ti c int conne ct _ host CL I ENT N UM ; ?st a tic i nt co n ne ct _nu mb

5、er= 0 ;/ 连 接得客户数?s t a t ic void * han dle_c o nne ct (vo i d*a r gv) /业务连接函数,处理客户端得 连接,将客户端得套接字描述符加入到连接池中? int re t;i nt s; ? i n t sc ; ?s=* (int * ) a rg v); / 服务端套接字描述符int i = 0 ; ? st r u c t sock a ddr_ i n cli e n t _add r ;i nt 1 en ; ? le n =siz e of (s tr u c t so ck add r_in ) ;? f o r (;

6、 ;) /监听有没有客户 端到来? sc= acc e p t(s, (struc t soc k a d dr *) &client a ddr,& 1 e n );? printf ( a c li e nt c o nne ct,fro m:%s n ”,in et_n toa(c 1 ien t_ad d r、s i n _ a ddr);i f (sc0 ) ?f o r(i=0 ; i C LI EN T NU M; i+ )if (co nne ct_ h osti = 1) c o n nect_hosti =sc ; ?c o nne ct_ n umber+ ; ?b re

7、ak;? ? ?/请求业务处理线程st atic void 衣 h a n dl e_ req uest( vo id 衣 arg v)tim e_t now;c har buffe r BUFFERSIZE;int s i ze;/设置轮循得时间,每隔 1 秒? s tru ct time v al tv; ? tv、tv se c =1 ;t v、tv _usec= 0 ;i nt re t; ? i n t i=0 ;in t m a x fd ; ? f d_set scanfd ; ? fo r( ; )? F D_ZE R O (&sca nf d ); / / 清空文件描 述符集

8、合将文件描述符放入文件描述符集合? fo r (i=0 ;iCL I ENTNUM;i+ +) ? if(co n nect_hosti != 1)FD_ S ET ( conne c t hosti , &s c a n fd);if(ma x fd connect_ho s ti) ?maxf d= c o nnect_ h os t i; ? ? / se lec t ? ret=select(maxfd+1 , &sca nfd , N U LL,NULL, &tv); 监控读文件描述符集 , 瞧瞧就是否有数据可读s w it ch (ret) ca s e - 1: /错误b r e

9、 ak; ? case 0:/ /超时bre ak; ? defa ul t: /有数据到来?if (c o nnect_number0 )b r e a k;for( i=0;i 0& &!strnc m p(b u ffer,T IM E, 4) ) /时间请求?me mset (buffer, 0 ,B U FFER SI ZE );?n o w =ti m e( N U L L );?s printf (b uff e r, %n ,ctime(&n ow);se n d (conn e ct_host i, buf f e r ,str 1 e n( buffer) , 0);/更新

10、文件描述符数组中得值c onnect_ho s t i= -1 ;connect_ n umber;close (c on n e ct_ho s t i); / /关闭客户端套接字描述符?? ? bre a k; ?i nt m a in(i n t arg c, char*a r gv ) ? int r e t;i n t s;struct s o ckaddr_in server_ a dd r;int i;pthre a d_t th re ad : 2; / /两个线程,一个就是处理连接,另一个就是处理请求? 建立TC P套 接字s = sock et (AF_INET,SOCK

11、_S T RE AM,0 ) ;? me ms et (c on n e ct_h o st, 1,C L I E NTNUM ) ;/ /将存储套接字描述符得数组为一1? if (s 0) ? perror(s o cket erro r” ; ? ret urn -1 ; ? /将地址结构绑定到套接字描述符serv er _ a dd r、s i n _ f a mily= AF _INE T ;server_a d dr、sin_addr、s_a d dr=hto n l(INA D DR_A NY);se rver _ addr、sin_po r t= h t ons ( PORT);

12、r et=bin d (s, ( str u ct s o c k addr* ) & s erve r _ a ddr,sizeof(stru c t s ock add r _in) ) ;? i f(ret 0)p erro r (” bi n d e rro r );? r e turn 1;? 监听? r e t = li s ten (s,E AC KL OG); ? if (ret v 0) per r o r ( si ten e rror ) ;? ret u rn 1 ;?pthr ea d_ ere at e ( & th r ea d 0, N U LL, han di

13、e conn ec t,(vo i d*) & s); /处理客 户端连接,传递得就是服务器得套接字描述符 ? pt h read _e reate ( & th re ad 1 ,NU LL ,h a n dle_reques t ,NULL); / ha n dle r eq ue s t 线程回调函数?等待线程结束? f or(i= 0 ;i v 2 ; i+)? p t hread jo i n(t h rea di, NULL );?c lo se(s) ; ?客户端:#incl u de ?# in e lude st r i n g、h #i nclude# inclu d e

14、v sys/s oe ke t、h# includesy s/typ e s、h #in cl ude v time、h# i ne lude v netinet/in、h?#d efi n e P ORT 88 8 8#d efi ne BU FFER SIZE 1024 ?int mai n( int argc,c h ar * a r gv )int s ; ? int ret; ? int s i ze;stru e t soc kaddr in ser v er_ad dr; ? char bu f fer BUFFERS IZ E;? s= socket (A FNE T,S O

15、CK_ STREAM , 0);if (s v 0) ? p er r or( s o cket err o r);re t urn 1;b z e r o (&s e r ver_ad d r, s izeo f ( server_a d dr); ?/ / 将地址结构绑定到套接字s erv er_ a ddr、si n _ fa mil y=AF_ IN E T; ?ser v er_ad d r、sin_port = ht o ns(PORT); serv e r_ad d r、si n addr、s ad d r = ht o nl (INADDR_ANY ) ; ?/连接服务器r e

16、t=c onnect (s,(s truct s o ckaddr* ) &s er v e r_add r, size o f(ser v er_a d dr) ); ? i f( re t= 1) ? pe r ro r (c onne et er r o r);re t u r n 1;m ems e t(buffe r, 0 ,B UF F ERSIZE ) ;?strcpy(b u f f er, ” TIME:)size = se nd (s, buf f er,strle n (bu ffe r), 0); ?i f (size 0) ? p err o r( send e r

17、r or); ? r et urn -1;me mse t(b u ffe r,0, B U FF E RS I ZE);size = recv (s, b u ffer, B U FFERSIZE,0);i f(size0 )perror( recv e r r or ) ;? re t urn;?p rintf( %s, buf f er) ;?clo se (s);return 0 ;运行结果:r o otlocal host 1 4 章服务器模式#、/ sele c t-t c pa c l ient co n nec t,f rom : 127、0、0、1?r o otl o c a lhost 14 章服务器模式#、/c i rcle-tcp c 14S a t Fe b 18 14:28 : 1 02 0 1 2总结:本文主要针对简单循环服务器,并发服务器得不足,介绍了I/O复用得循环服务器,最后给出了实例、

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!