winsock中select的作用

本文介绍select函数的功能及使用方法,该函数用于监听多个socket句柄的状态变化。通过select函数,开发者可以得知哪些socket句柄可以进行读操作、写操作或者出现了错误。文章提供了使用示例,包括如何初始化和清理socket句柄集合、如何判断socket是否准备好进行相应的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 select函数用来填充一组可用的socket句柄,当满足如下条件时:
1.可以读取的sockets。当这些socket被返回时,在这些socket上执行recv/accept等操作不会产生阻塞;
2.可以写入的sockets。当这些socket被返回时,在这些socket上执行send等不会产生阻塞;
3.返回有错误的sockets。

同时和select配对使用的还有:
FD_CLR(s, *set)
Removes the descriptor s from set.
FD_ISSET(s, *set)
Nonzero if s is a member of the set. Otherwise, zero.
FD_SET(s, *set)
Adds descriptor s to set.
FD_ZERO(*set)
Initializes the set to the null set.

示例代码:
  SOCKET     s;   
  fd_set     fdread;   
  
int           ret;   
    
  
//   Create   a   socket,   and   accept   a   connection   
    
  
//   Manage   I/O   on   the   socket   
  while(TRUE)   
  {   
          
//   Always   clear   the   read   set   before   calling     
          
//   select()   
          FD_ZERO(&fdread);   
    
          
//   Add   socket   s   to   the   read   set   
          FD_SET(s,   &fdread);   
    
          
if   ((ret   =   select(0,   &fdread,   NULL,   NULL,   NULL))     
                  
==   SOCKET_ERROR)     
          {   
                  
//   Error   condition   
          }   
    
          
if   (ret   >   0)   
          {   
                  
//   For   this   simple   case,   select()   should   return   
                  
//   the   value   1.   An   application   dealing   with     
                  
//   more   than   one   socket   could   get   a   value     
                  
//   greater   than   1.   At   this   point,   your     
                  
//   application   should   check   to   see   whether   the     
                  
//   socket   is   part   of   a   set.   
    
                  
if   (FD_ISSET(s,   &fdread))   
                  {   
                          
//   A   read   event   has   occurred   on   socket   s   
                  }   
          }   
  }   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值