select是网络编程中典型的IO复用技术,在一些对并发性要求不是很高的场合还是经常使用select的,所以就打算把select的使用注意点逐渐的罗列出来。
1、select的中间三个参数读、写和异常集合是值-结果参数,调用select时这三个参数是告诉内核需要内核监测哪些描述符,
select返回时会把这个三个集合中准备就绪的描述符在相应的监测集合中置为1(告诉用户层哪些描述符已经准备就绪)。
其他的就清为0了,因此每次在调用select前都需要对监测集合重新set。也是说如果循环调用select那么要将FD_ZERO()、FD_SET()和select一块均写在循环中。
2、描述符就绪条件
(1)套接字描述符可读就绪条件
①套接字接收缓冲区中有数据
②套接字接收缓冲区收到EOF,即对端发送FIN
③套接字出现错误,如收到RST
3、标准IO不要和select混用
因为标准IO里面带有缓冲区,而select判断描述符是否可读是从系统调用的角度来判断的,如果使用标准IO很有可能出错。
4、服务端使用select技术时,要注意把已连接描述符存储下来,因为select只返回就绪描述符的个数,并没有直接告诉我们是哪些描述符就绪了。
5、select监测的描述符中除了listen的描述符外,其他描述符最好设置为非阻塞模式,因为如果客户端只给服务端发了一个字节的数据,然后也不关闭连接,那么在服务端select会发现该描述符可读了,就回去读这个描述符的数据,肯定是循环调用read之类的函数读的,因为第一次读返回1大于0就要接着读,结果再读就被阻塞了,因为没有数据了。如果是非阻塞的描述符再读就立即返回-1,当然errno也会被置为EWOULDBLOCK。
阅读(946) | 评论(0) | 转发(0) |