socket笔记3 select模型

2.17 服务器/客户端升级为select模型处理多客户端

在这里插入图片描述

  • select 函数:int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);
    第一个参数是一个整数,指fd_set集合中所有socket的范围,而不是数量。即是所有描述符最大值+1,在windows中可以写0。
    参数readfds、writefds和exceptfds 称为描述词组,是用来回传该描述词的读,写或例外的状况。
    最后一个参数是超时时间,设置为NULL时会一直阻塞到有信息进来;若设置一段时间,则会阻塞一段时间。服务器既可以处理多个客户端的请求,也可以在空闲时候做服务器自己的业务处理(例如主动给客户端发信息)。
    返回值:如果返回-1,说明出现错误。返回值为0,说明没有满足条件的文件描述符,且设置的timeval监控时间超时。返回值大于0,说明监视的相应的文件描述符集中满足条件(可读,可写,出现异常)。
  • fd_set:文件描述符集合。文件描述符即socket。
    一个fd_set变量是由很多个二进制构成的数组,每一位表示一个文件描述符是否需要监视。
    一个fd_set最多放1024个socket,是由unix内核决定的。如果超出,会导致core dump。解决方法:不用select,用epoll。
    对于fd_set类型的变量,我们只能使用相关的函数来操作。
void FD_CLR(int fd, fd_set *set);//清除某一个被监视的文件描述符。
int  FD_ISSET(int fd, fd_set *set);//测试一个文件描述符是否是集合中的一员
void FD_SET(int fd, fd_set *set);//添加一个文件描述符,将set中的某一位设置成1;
void FD_ZERO(fd_set *set);//清空集合中的文件描述符,将每一位都设置为0;

code:https://github.com/surserrr/learn_socket/tree/4fed70e095ca991f89355bcc2202ea723a500b0e

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值