欢迎来到天天文库
浏览记录
ID:56794191
大小:39.50 KB
页数:8页
时间:2020-07-12
《Linux网络编程之IO复用循环服务器.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、1.介绍在前几节,我们介绍了循环服务器,并发服务器.简单的循环服务器每次只能处理一个请求,即处理的请串行的。而并发服务器可以通过创建多个进程或者是线程来并发的处理多个请求。但由于进程或线程的切换会带来一定的开销。而且随着客户端请求的增多,创建的线程或进程的数目也越来越多,开销势必会增加。因此,本文提出了I/O复用的循环服务器。I/O复用的循环服务器创建两个线程,一个是客户端连接处理线程,专门用来处理客户端的连接,当有客户端到来的时候,此线程把客户端的套接字描述符放到一块公共的区域中。另一个是业务处理线程,此线程轮循(select)客户端套接字描述符集合
2、中有没有数据到来,如果有数据到来,那么就进行处理。2.I/O复用循环服务器处理流程socket(...);bind(...);listen(...);pthread_create(...);pthread_join(..);close(...);//关闭服务器套接字连接处理线程:while(1){ accept(...); store(...);//存储客户端套接字描述符}业务处理线程:while(1){ get(...);//取出套接字描述符放到FD_SET select(...); recv(....); process(...); send(..
3、.); close(....);}从算法的主要流程可以看出,I/O复用循环服务器只用两个线程,一个是请求业务连接线程,专门处理连接。另一个是业务处理线程,轮循客户端的套接字有没有数据。3.相关例子服务器;#include#include#include#include#include#include#include#include/**I/O复用循环服务器I/O并发服务器随着客
4、户端的增多,必须增加处理单元,系统的负载会移动多个处理单元的切换上,切换进程或者是线程而I/O复用服务器包括两个线程,一个是业务连接线程,专门处理客户端的连接,另一个是业务请求处理线程,对多个客户端描述符进行一定时间的等待,即select监听多个描述符**/#definePORT8888#defineCLIENTNUM1024#defineBUFFERSIZE1024#defineBACKLOG10staticintconnect_host[CLIENTNUM];staticintconnect_number=0;//连接的客户数staticvoid*
5、handle_connect(void*argv){//业务连接函数,处理客户端的连接,将客户端的套接字描述符加入到连接池中 intret; ints; intsc; s=*((int*)argv);//服务端套接字描述符 inti=0; structsockaddr_inclient_addr; intlen; len=sizeof(structsockaddr_in); for(;;){//监听有没有客户端到来 sc=accept(s,(structsockaddr*)&client_addr,&len); printf("
6、aclientconnect,from:%s",inet_ntoa(client_addr.sin_addr)); if(sc>0){ for(i=0;i7、oid*handle_request(void*argv){ time_tnow; charbuffer[BUFFERSIZE]; intsize; //设置轮循的时间,每隔1秒 structtimevaltv; tv.tv_sec=1; tv.tv_usec=0; intret; inti=0; intmaxfd; fd_setscanfd; for(;;){ FD_ZERO(&scanfd);//清空文件描述符集合 //将文件描述符放入文件描述符集合 for(i=0;i8、host[i]!=-1){ FD_SET(connect_host[i],&scan
7、oid*handle_request(void*argv){ time_tnow; charbuffer[BUFFERSIZE]; intsize; //设置轮循的时间,每隔1秒 structtimevaltv; tv.tv_sec=1; tv.tv_usec=0; intret; inti=0; intmaxfd; fd_setscanfd; for(;;){ FD_ZERO(&scanfd);//清空文件描述符集合 //将文件描述符放入文件描述符集合 for(i=0;i8、host[i]!=-1){ FD_SET(connect_host[i],&scan
8、host[i]!=-1){ FD_SET(connect_host[i],&scan
此文档下载收益归作者所有