這篇文章主要講述select的使用,selcet的優點在於, 它是POSIX所規定的, 所有正常的操作系統都是有的。 說白了, 就是通用, 通用, 通用
select
原型
/** * @param {int} nfds 需要檢查的文件描述符個數 * @param {fd_set*} readset 用來檢查可讀性的一組文件描述符 * @param {fd_set*} writeset 用來檢查可寫性的一組文件描述符 * @param {fd_set*} exceptset 用來檢查是否有異常的一組文件描述符 * @param {timeval*} 超時時間, 填寫NULL的時候表示堵塞, 填寫0為非堵塞,其他為超時時間 * @retun {int} 發生錯誤時,返回SOCKET_ERROR **/ int select(int nfds, fd_set* readset, fd_set* writeset, fd_set* exceptset, struct timeval* timeout)
fd_set
fd_set其實是一個數組的宏定義, 實際上是一個long類型的數組, 存放的是文件描述符(文件句柄)
- FD_SET //添加文件描述符
- FD_CLR // 清空文件描述符
- FD_ISSET // 判斷對應的文件描述符是否存在
- FD_ZERO //將fd_set 全部清零
範例 1
FD_SET(int fd, fd_set *fdset); //將fd加入set集合 FD_CLR(int fd, fd_set *fdset); //將fd從set集合中清除 FD_ISSET(int fd, fd_set *fdset); //檢測fd是否在set集合中,不在則返回0 FD_ZERO(fd_set *fdset); //將set清零使集合中不含任何fd