select函数用法简单总结

在Linux中我们可以通过man + 函数名, 命令查看Linux编程手册从而查看一个函数的具体用法。

select函数原型为:

 int select(int nfds, fd_set *readfds, fd_set *writefds,    fd_set *exceptfds, struct timeval *timeout);

需要包含的头文件有:

 #include <sys/select.h>

 /* According to earlier standards */
 #include <sys/time.h>
 #include <sys/types.h>
 #include <unistd.h>

其中个参数总结如下:

  • nfds : 当前所有集合中最大的描述符值
  • readfds: 探测可读描述符值
  • writefds:探测可写描述符值
  • exceptfds:探测异常描述符集合
  • timeout:等待超时时间 0 , 0–非阻塞,NULL 永久阻塞

同时在手册中我们还可以看到其他几个相关的函数,分别为:

  • nfds : 当前所有集合中最大的描述符值
  • void FD_CLR(int fd, fd_set *set); //从集合中删除指定描述符
  • int FD_ISSET(int fd, fd_set *set); //判断集合中是否有指定的描述符或就绪
  • void FD_SET(int fd, fd_set *set); //相集合中添加指定描述符
  • void FD_ZERO(fd_set *set); //清空集合

在网络编程中使用select的优缺点可简单总结为:

优点: 可移植性强,可同时处理多个连接请求;
缺点: 1.监听描述符个数有上限–1024,可以修改头文件,但需要重新编译;
2.需要定义数组保存所有描述符值,以便在新连接到来或者有旧连接关闭时可以重新确定最大的描述符值;
3.每次处理完毕后,需要清空并重新向集合中添加新描述符,因为select 对描述符状态的改变是直接在原有基础上改变的,因此需有每次清空;
4.select 并不会告诉我们哪一个描述已经就绪,只是在原有集合上修改状态,因此当我们处理的时候,需要循环遍历集合中的所有描述符才能判断哪一个是就绪描述符—(当监听数目过大时,效率较低)。

Select使用步骤:
1.创建socket
2.定义监听地址信息,并为socket 绑定监听地址
3.开始监听(告诉系统开始监听地址是否有数据到来)
4.将socket 描述添加到select 的监听集合中。监听集合用于select监听判断集合中的描述符是否就绪
5.select开始监听
6.select返回值

  • < 0 select出错
  • ==0 等待超时
  • 大于0 已经有描述符就绪

7.当描述符就绪,判断描述符是否=监听Socket 描述符(代表有新连接请求)
8.=socket 监听符(accept 处理新的连接请求)
!=监听Socket描述符(代表有传输数据到来),接受收据
9.接受出错,将描述符从select监听集合中删除,并关闭,重新确定最大的描述符值
10.关闭Socket网络套接字。

发布了71 篇原创文章 · 获赞 279 · 访问量 24万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章