select()函数返回值及select与socket阻塞的关系及select函数的意义

1、select()函数返回值

select的返回值与recv函数的返回值十分类似,都分>0,=0,<0三种情况。

>0:有事件发生,

         FD_ISSET(socket, &fd_read);

         recv().......

=0:timeout,超时

---------------此时需要先FD_ZERO(),FD_SET();再select

---------------这是因为,要监视的文件描述符在位图中被置1,当有事件发生时,文件描述符仍为1,但没有事件发生的文件描述符会被置0,所以,要想监视所有的文件描述符,第2此循环需要重新将所有的文件描述符进行FD_SET();置1设置。

<0:出错。

 在出错的情况下,

当错误为EINTR,认为连接是正常的,继续接收

if(errno == EINTR )
          continue;

--------------------报此错误需要继续select;不需要FD_ZERO(),FD_SET();

select函数没有(errno == EAGAIN)||errno == EWOULDBLOCK)错误;

这两种错误是recv和send是会出现的错误。

2、select()函数与socket阻塞的关系

select()与socket是否阻塞没有任何关系,也就是说,无论socket是阻塞状态还是非阻塞态都可以与select进行搭配。

3、select函数的意义

参考该文

1)select函数是多路IO复用,故当有多路IO的时候,会发挥优势:

当某一路IO处于阻塞态时,select监视到其他的IO有读或写,就可以让其他路的IO读写;如果没有select,当有一路IO阻塞,其他的IO即使可以读写,也无法进行。

4、套接字的属性默认是阻塞的原因

参考该文

因为,当某个设备是阻塞的时候,相当于处于sleep的状态,即:让出CPU,

但当设备处于非阻塞态时,会不断的轮询,占用CPU,故默认的是阻塞态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值