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

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进行搭配。

 

你可能感兴趣的:(网络编程)