收藏 分享(赏)

异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET.doc

上传人:scg750829 文档编号:7776676 上传时间:2019-05-25 格式:DOC 页数:3 大小:27.50KB
下载 相关 举报
异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET.doc_第1页
第1页 / 共3页
异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET.doc_第2页
第2页 / 共3页
异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

1、异步套接字基础:select 函数以及 FD_ZERO、FD_SET、FD_CLR、FD_ISSET.txt41 滴水能穿石,只因为它永远打击同一点。42 火柴如果躲避燃烧的痛苦,它的一生都将黯淡无光。select函数: 系统提供 select函数来实现多路复用输入/输出模型。原型: #include sys/time.h #include unistd.h select函数: 系统提供 select函数来实现多路复用输入/输出模型。原型: #include sys/time.h #include unistd.h int select(int maxfd,fd_set *rdset,fd_s

2、et *wrset,fd_set *exset,struct timeval *timeout); 参数 maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset 分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为 0。 FD_ZERO,FD_SET,FD_CLR,FD_ISSET: 参数 maxfd是需要监视的最大的文件描述符值+1;rdset,wrset,exset 分别对应于需要检测的可读文件描述符的集合,可

3、写文件描述符的集 合及异常文件描述符的集合。struct timeval结构用于描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生则函数返回,返回值为 0。 FD_ZERO,FD_SET,FD_CLR,FD_ISSET: FD_ZERO(fd_set *fdset);将指定的文件描述符集清空,在对文件描述符集合进行设置前,必须对其进行初始化,如果不清空,由于在系统分配内存空间后,通常并不作清空处理,所以结果是不可知的。 FD_SET(fd_set *fdset);用于在文件描述符集合中增加一个新的文件描述符。 FD_CLR(fd_set *fdset);用于在文件描述符集合中删除

4、一个文件描述符。 FD_ISSET(int fd,fd_set *fdset);用于测试指定的文件描述符是否在该集合中。 struct timeval结构: struct timeval long tv_sec;/second long tv_usec;/minisecond timeout设置情况: null:select将一直被阻塞,直到某个文件描述符上发生了事件。 0:仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生。 特定的时间值:如果在指定的时间段里没有事件发生,select 将超时返回。 -(fd_set) 是一组文件描述符(fd)的集合。由于 fd_set类型的长度在

5、不同平台上不同,因此应该用一组标准的宏定义来处理此类变量:fd_set set; FD_ZERO( /* 将 set清零 */ FD_SET(fd, /* 将 fd加入 set */ FD_CLR(fd, /* 将 fd从 set中清除 */ FD_ISSET(fd, /* 如果 fd在set中则真 */ 在 过去,一个 fd_set通常只能包含少于等于 32个文件描述符,因为 fd_set其实只用了一个 int的比特矢量来实现,在大多数情况下,检查 fd_set能包括任意值的文件描述符是系统的责任,但确定你的 fd_set到底能放多少有时你应该检查/修改宏 FD_SETSIZE的值。*这个值

6、是系 统相关的*,同时检查你的系统中的 select() 的 man手册。有一些系统对多于1024个文件描述符的支持有问题。多路复用的方式是真正实用的服务器程序,非多路复用的网络程序只能作为学习或着陪测的角色。本文说下个人接触过的多路复用函数:select/poll/epoll/port。kqueue 的*nix 系统没接触过,估计熟悉了上面四种,kqueue 也只是需要熟悉一下而已。一、select 模型select原型: int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeva

7、l *timeout);其中参数 n表示监控的所有 fd中最大值1。和 select模型紧密结合的四个宏,含义不解释了:FD_CLR(int fd, fd_set *set);FD_ISSET(int fd, fd_set *set);FD_SET(int fd, fd_set *set);FD_ZERO(fd_set *set);理解 select模型的关键在于理解 fd_set,为说明方便,取 fd_set长度为 1字节,fd_set 中的每一 bit可以对应一个文件描述符 fd。则 1字节长的 fd_set最大可以对应 8个 fd。(1)执行 fd_set set; FD_ZERO(则

8、set用位表示是 0000,0000。(2)若 fd5,执行 FD_SET(fd,后 set变为 0001,0000(第 5位置为 1)(3)若再加入 fd2,fd=1,则 set变为 0001,0011(4)执行 select(6,nSock=0;arraynSock+=listen_fd;(之前 listen port已绑定并 listen)maxfd=listen_fd;whileFD_ZERO(foreach (fd in array) fd大于 maxfd,则 maxfd=fdFD_SET(fd,arraynsock+=newfd;if(-res=0) continueforeach 下标 1开始 (fd in array) if(FD_ISSET(fd,&set)执行读等相关操作如果错误或者关闭,则要删除该 fd,将 array中相应位置和最后一个元素互换就好,nsock 减一if(-res=0) continue

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报