1.选择(select)模型:
选择模型:通过一个fd_set集合管理套接字,在满足套接字需求后,通知套接字。让套接字进行工作。避免套接字进入阻塞模式,进行无谓的等待。选择模型的核心的FD_SET集合和select函数。通过该函数,我们可以们判断套接字上是否存在数据,或者能否向一个套接字写入数据。

2.select函数:
int select(
    int nfds,//忽略,只是为了兼容而存在。
    fd_set FAR* readfds,//可读性检查(有数据可读入,连接关闭,重设,终止)
    fd_set FAR* writefds,//可写性检查(有数据可发出)
    fd+set FAR* exceptfds,//带外数据检查(带外数据)
    const struct timeval FAR* timeout//超时
    );

3.select模型的工作步骤:
(1)首先把套接字加入到fd_set集合
(2)检查套接字的可读写性
(3)检查套接字是否还在fd_set集合上
(4)处理数据

4.在三个参数中(readfds、writefds和exceptfds),任何两个都可以是空值;但是,至少有一个不能为空值!最后一个参数timeout对应的是一个指针,它指向一个timeval结构,用于决select最多等待I/O操作完成多久的时间。如timeout是一个空指针,那么select函数会无限期地“等待下去,直到至少有一个套接字符合指定的条件后返回。select成功完成后,会在fd_set集合中,返回未完成的I/O操作的套接字句柄的总量。若超时,便会返回0。不管由于什么原因,假如select调用失败,都会返回SOCKET_ERROR错误。

5.timeval结构体定义:
struct timeval
{
    long tv_sec;//秒数
    long tv_usec;//毫秒数
};

6.fd_set集合:用select函数对套接字进行监视之前,必须要将套接字分配给一个fd_set集合,设置好读、写以及带外数据的fd_set结构。将一个套接字分配给任何一个集合后,再来调用select进行监视,便可知道一个套接字上是否正在发生上述的I/O活动。Winsock提供了下列宏操
作,对fd_set进行处理和检查:
    FD_ZERO(*set):初始化set
    FD_SET(s, *set):将套接字s加入集合set
    FD_CLR(s, *set):从set中删除套接字s。
    FD_ISSET(s,*set):检查s是否还在集合set上,在调用select函数之前必须对此进行判断。

7.select模型的工作步骤:
(1) 使用FD_ZERO宏,初始化自己感兴趣的每一个fd_set。
(2) 使用FD_SET宏,将套接字句柄分配给自己感兴趣的每个fd_set。
(3) 调用select函数,等待I/O操作的完成。
(4) 根据select的返回值,我们便可判断出哪些套接字存在着尚未完成(待决)的I/O操作,.具体的方法是使用FD_ISSET宏,对每个fd_set集合进行检查。
(5) 知道了每个集合中“待决”的I/O操作之后,对I/O进行处理,然后返回步骤1 ),继续进行select处理。
(6)select返回后,它会修改每个fd_set结构,删除那些不存在待决I/O操作的套接字句柄。这正是我们在上述的步骤( 4 )中,为何要使用FD_ISSET宏来判断一个特定的套接字是否仍在集合中的原因。

示例代码:

 SOCKET s;
fd_set fdread;
int ret; //初始化
... //Manage I/O on the socket
while()
{
FD_ZERO(&fdread);//初始化集合 FD_SET(s,&fdread);//添加套接字到集合上 ret=select(,&fdread,NULL,NULL,NULL);//调用select函数监视网络事件的完成情况
if(ret==SOCKET_ERROR)
{
...
} if(res>)
{
//处理数据
... if(FD_ISSET(s,&fdread))//检查套接字是否还在集合上
{
...
}
} }

一.Windows I/O模型之选择(select)模型的更多相关文章

  1. Select模型及tcp select模型

    参考:http://m.blog.csdn.net/article/details?id=51420015 一.套接字模式 套接字模式简单的决定了操作套接字时,Winsock函数是如何运转的.Wins ...

  2. Windows I/O模型之一:Select模型

    1.概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock) 四种调用模式: 同步:所谓同步,就是在发出一个功能调用时,在没有得到结果 ...

  3. C++ Windows 上简单的非阻塞Select模型

    说明:当客户端连接数超过64个的时候,每次最多select64个,但每一帧可以select多次,理论上可以突破fd个数的限制 .h #ifndef _MODULE_SELECT_H_ #define ...

  4. Winsock—I/O模型之选择模型(一)

    Winsock中提供了一些I/O模型帮助应用程序以异步方式在一个或多个套接字上管理I/O. 这样的I/O模型有六种:阻塞(blocking)模型,选择(select)模型,WSAAsyncSelect ...

  5. windows下的IO模型之选择(select)模型

    1.选择(select)模型:选择模型:通过一个fd_set集合管理套接字,在满足套接字需求后,通知套接字.让套接字进行工作. 选择模型的核心是FD_SET集合和select函数.通过该函数,我们可以 ...

  6. 网络编程第六讲Select模型

    网络模型第六讲Select模型 一丶Select模型是什么 以前我们讲过一个迭代模型.就是只服务一个客户端连接.但是实际网络编程中.复杂的很多. 比如一个 C/S架构程序 (客户端/服务端) 客户端很 ...

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

    Linux关于并发网络分为Apache模型(Process per Connection (进程连接) ) 和TPC , 还有select模型,以及poll模型(一般是Epoll模型) Select模 ...

  8. Windows网络编程系列教程之四:Select模型

    讲一下套接字模式和套接字I/O模型的区别.先说明一下,只针对Winsock,如果你要骨头里挑鸡蛋把UNIX下的套接字概念来往这里套,那就不关我的事. 套接字模式:阻塞套接字和非阻塞套接字.或者叫同步套 ...

  9. [转载]Windows网络编程系列教程之四:Select模型

    原文:http://www.51see.com/asp/bbs/public/bp_show.asp?t_id=200308131152297103 讲一下套接字模式和套接字I/O模型的区别.先说明一 ...

随机推荐

  1. Linux系统编程@进程管理(一)

    课程目标: 构建一个基于主机系统的多客户即时通信/聊天室项目 涉及的理论知识 进程控制:僵尸进程/孤儿进程.进程控制.守护进程... 进程间通信:管道.命名管道.信号... 多线程编程: 锁.信号量. ...

  2. Js中判断变量存不存在的问题

    前面写过jquery对象存在与否的判断.现在谈下Js中判断变量存不存在的问题. 如果这样if(!a),当变量a在js中没有申明时,就会报错,那么接下去的代码将不会被执行.注意,这种判断只要变量申明过, ...

  3. day09网络编程

    一 操作系统基础 操作系统:(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才 ...

  4. Android对手尽皆铩羽,鸿蒙如何绝地求生?

    Android对手尽皆铩羽,鸿蒙如何绝地求生? 作为华为绝地反击备胎计划中的重要组成部分,鸿蒙被国人寄予了厚望.但是,除了热情我们更应该理性关注,鸿蒙对决Android未来有几成胜算?还有哪些问题需要 ...

  5. 使用dom4j生成word的方法

    http://blog.csdn.net/zhyh1986/article/details/8727523#t6 http://blog.csdn.net/zuozuofuwaiwai/article ...

  6. python与php生成二维码对比

    php生成二维码 include 引入的库单独下载 <?php header("Content-type:text/html;charset=utf-8"); error_r ...

  7. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)-转帖篇

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  8. 序列模型(4)----门控循环单元(GRU)

    一.GRU 其中, rt表示重置门,zt表示更新门. 重置门决定是否将之前的状态忘记.(作用相当于合并了 LSTM 中的遗忘门和传入门) 当rt趋于0的时候,前一个时刻的状态信息ht−1会被忘掉,隐藏 ...

  9. nyoj158-省赛来了

    省赛来了 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 一年一度的河南省程序设计大赛又要来了. 竞赛是要组队的,组队形式:三人为一队,设队长一名,队员两名. 现在问题就 ...

  10. PHP做的简单计算器

    使用php做的简易计算器 能够进行+,-,*,/运算. 如下图 <?php if (isset($_POST['button'])) { $num1 = $_POST['num1']; $num ...