Winsock异步IO----select模型

Winsock异步IO模型中的SELECT选择模型是比较轻巧 可以用在偏小型的网络程序,核心就是select 函数,利用select 可以判断特定的socket是否有可读的数据,能不能向某个套接字进行写入数据,防止程序在Socket处于阻塞模式中时,在一次 I/O 调用(如send或recv、accept等)过程中,被迫进入“锁定”状态;同时防止在套接字处于非阻塞模式中时,产生WSAEWOULDBLOCK错误。

先了解一下:同步与异步;阻塞和非阻塞。同步:事情由我来做;异步:交代操作系统该做的任务,自己先干些别的,系统做好了之后再来通知你,给你结果。 阻塞与非阻塞:阻塞:条件未就绪,事情没做完,我只能死等着,或者睡眠; 非阻塞;事情未做完之前,我可以转身做些别的事情,不过这点事情也只是低效的轮转罢了。

select 函数: select(
  __in          int nfds,
  __in_out      fd_set* readfds,
  __in_out      fd_set* writefds,
  __in_out      fd_set* exceptfds,
  __in          const struct timeval* timeout
)第一个参数被忽略,第二个检查数据可读性,第三个检查可写性,第四个检查例外数据;最后一个是超时时间,不要设成0。

FD_SET结构:typedef    struct    fd_set {     u_int    fd_count;       SOCKET    fd_array[FD_SETSIZE];   }       fd_set;

假设我们要检查当前是否有数据可读,就在第二个参数中加入自己的套接字,调用select 函数,完成之后,检查返回值,非0 则有数据;然后再检查自己的套接字还是不是readfds这个结构中的那个,如果是,就是有数据来了,马上接受recv过来。

用 select 对套接字进行监视之前,必须将套接字句柄分配给一个fdset的结构集合,之后再来调用 select,便可知道一个套接字上是否正在发生上述的 I/O 活动。
Winsock 提供了下列宏操作,可用来针对 I/O活动,对 fdset 进行处理与检查:
● FD_CLR(s, *set):从set中删除套接字s。
● FD_ISSET(s, *set):检查s是否set集合的一名成员;如答案是肯定的是,则返回TRUE。
● FD_SET(s, *set):将套接字s加入集合set。
● FD_ZERO( * set):将set初始化成空集合。

下面,是应用select 的一个常见的步骤:

1) 使用FDZERO宏,初始化一个fdset对象;
2) 使用FDSET宏,将套接字句柄加入到fdset集合中;
3) 调用 select 函数,等待其返回……select 完成后,会返回在所有 fdset 集合中设置的套接字句柄总数,并对每个集合进行相应的更新。
4) 根据 select的返回值和 FDISSET宏,对 fdset 集合进行检查。
5) 知道了每个集合中“待决”的 I/O操作之后,对 I/O进行处理,然后返回步骤1 ),继续进行 select 处理。

select 函数返回后,会修改 fdset 结构,删除那些不存在待决 I/O 操作的套接字句柄。这正是我们在上述的步骤 ( 4 ) 中,为何要使用 FDISSET 宏来判断一个特定的套接字是否仍在集合中的原因。

 在我的资源页里面有一个这样的应用例子,供大家参考。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值