I/O模型之Select模型

刚刚又看了一下I/O模型的相关知识做了一下总结,与大家一同交流.

Selct 模型说的就是在套接字集合fd_set中的操作(可将多个套接字连在一起,形成套接字集合)

套接字集合呢,又分为了3中形态,对应表示的关系如下:

套接字集合 有事件发生   到底啥事呢

readfds    select函数等待   有未决连接请求 或 数据可读  或   连接关闭/重启/中断

writefds     select函数等待连接成功(调用connect)  或 数据可写

exceptfds   select函数等待连接失败  或 OOB数据可读

而我们判断是否可读可写等操作主要使用下面的方法,举个例子:

测试某套接字S是否可读,将它添加到readfds中,等待select函数返回,调用完成后判读S是否还在readfds里面即可

大致流程就是这样的:

(1)初始化一个套接字集合fdsocket,添加监听套接字句柄sListen到这个集合:

fd_set   fdsocket;

FD_SET(sListen,&fdSocket);

(2)当fdsockt集合的一个拷贝fdRead传递给select函数,当有事件发生时,select函数就会移除fdRead中没有的未决的套接字句柄,并返回:

fd_set  fdRead=fdSocket;

int nRet=::select(0,&fdRead,null,null,null);

(3)通过将原来的fdSocket集合与select处理过的fdRead比较,确定有哪些套接字有未决I/O,并进一步处理他们:

for(int i=0;i<(int)fdSocket.fd_count;i++)

{

if(FD_ISSET(fdSocket.fd_array[i],&fdRead))//判断是否存在可读

{

if(fdSockt.fd_array[i] == sListen)//代表监听套接字想连呐

{

sockaddr_in addrRemote;

int nAddrLen =sizeof(addrRemote);

SOCKET sNew=::accept(sListen,(SOCKADDR*)&addrRemote,&nAddrLen);

FD_SET(sNew,&fdSockt);

}

else//说明有数据可读了

{

char szText[256];

int nRecv=::recv(fdSocket.fd_array[i],szText,strlen(szText),0);

}

}

}

可以知能否写,跟这个差不多。

选择模型的好处是能够在单个线程内处理多个套接字请求,但添加到fd_set结构的套接字数量是有限的默认为64个,最多也只能到1024个。

如果套接字过多,在调用select之前就不得不设置这1000个套接字,select返回之后,右必须检查这1000个套接字。

最后是我喜欢的一句话:

某些坚持成就了一系列的偶然。

时间: 2024-08-06 03:43:14

I/O模型之Select模型的相关文章

epoll模型与select模型的区别

Nginx  --->epoll模型 Apache --->select模型 处理大量连接的读写时,Apache所采用的select网络I/O模型比较低,用两个通俗的比喻来解释二者的区别: 第一个比喻: 例如你在大学读书,住的宿舍楼有很多房间,你的朋友要来找你,select版宿管大妈就会 带着你的朋友到各个房间挨个去找,直到找到为止.而epoll版宿管大妈会先记下每位入住同学的房间号码,当你朋友来找你时,只需告诉你的朋友你住在哪个房间?不用亲自带着你的朋友满宿舍的找.如果同时来了100个人,都

linux下多路复用模型之Select模型

Linux关于并发网络分为Apache模型(Process per Connection (进程连接) ) 和TPC , 还有select模型,以及poll模型(一般是Epoll模型) Select模型极其作用:这文章讲述的很好,没必要重述已有的东西,就直接给链接 http://blog.csdn.net/turkeyzhou/article/details/8609360 我的理解: 1 /* According to POSIX.1-2001 */ 2 #include <sys/selec

Socket I/O模型之select模型

socket网络编程中有多种常见的I/O模型: 1.blocking阻塞 2.nonblocking非阻塞 3.I/O multiplexing复用 4.signal driven 5.asynchronous I/O异步 这里我们主要介绍I/O multiplexing模型中的代表select模型:select模型将多个套接字放在一个集合里,然后统一检查这些套接字的状态,每次调用套接字后会更新这些套接字的状态,然后做判断,如果套接字可读,就执行read操作.这样就巧妙地避免了阻塞,达到同时处理

Winsock IO模型之select模型

之所以称其为select模型是因为它主要是使用select函数来管理I/O的.这个模型的设计源于UNIX系统,目的是允许那些想要避免在套接字调用上阻塞的应用程序有能力管理多个套接字. int select( int nfds,                                                 // 忽略,仅是为了与Berkeley套接字兼容 fd_set* readfds,                                  // 指向一个套接字集合,

Select 模型1

Select模型原理 利用select函数,判断套接字上是否存在数据,或者能否向一个套接字写入数据.目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据,被迫进入阻塞状态. select参数和返回值意义如下: int select ( IN int nfds,                           //0,无意义 IN OUT fd_set* readfds,      //检查可读性 IN OUT fd_set* writefds,  

Select模型原理

Select模型原理 利用select函数,推断套接字上是否存在数据,或者是否能向一个套接字写入数据.目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据,被迫进入堵塞状态. select參数和返回值意义例如以下: int select ( IN int nfds,                           //0,无意义 IN OUT fd_set* readfds,      //检查可读性 IN OUT fd_set* writefds

socket编程:多路复用之select模型

系统提供select函数来实现多路复用输入/输出模型. select函数让我们的程序监视多个文件描述符的状态变化.程序会停在select这里等待,直到被监视的文件描述符中有一个或多个发生了状态变化 函数原型如下: 返回值:   成功返回就绪描述符的个数,超过timeout时间且没有任何事件发生返回0,失败返回-1 参数解释: nfds:    被监视的文件描述符中值最大描述符值加1(描述符是从0开始的,描述符0.1.2...nfds-1均将被测试) 下面三个参数readset.writeset和

服务器select模型

多路转接I/O服务器中的一种:select服务器,该模型的服务器是将文件描述符放入队列中保存并监听,以轮询的机制去监听这些文件描述符,当相对应的文件描述符有读请求.写情况或异常发生时,对应的位将发生变化.select模型需要对所有监听的套接字实行轮询监听处理,当需要监听的套接字过多时,就可能出现响应不及时等问题,从而降低了服务器性能. 下面是服务器的实现(服务器将客户端发送过来的数据全部转换为大写) #include <stdio.h> #include <fcntl.h> #in

select模型的原理、优点、缺点

关于I/O多路复用: I/O多路复用(又被称为“事件驱动”),首先要理解的是,操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一 个通知.这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不 做纯返回-1和EAGAIN的无用功.写操作类似.操作系统的这个功能通过select/poll/epoll之类的系统调用来实现,这些函数都可以同时 监视多个描述符的读写就绪状况,这样,**多个描