这两天在学习linux网络编程,其中学习到了select框架,有些地方百思不得其解。今天搞明白了,在这里记录下。
涉及的代码内容:
fd_set rfds, rset; FD_ZERO(&rfds); FD_SET(sockfd, &rfds);
什么是fd_set类型;
它是一个无符号长整形的数组结构体。大体声明结构为:
struct fd_set {unsigned long val[1024/ 8 * sizeof(unsigned long)] // unsigned long为8字节长度,也就是8 * 8
}
关于FD_SET的理解:
fd_set rfds, rset;
FD_SET(sockfd, &rfds);
FD_SET在这里做了什么?
他是将sockfd的标志放入到rfds的中。
因为rfds是一个ul(unsigned long)类型的数组。而sockfd是文件句柄(int型,也就可以理解为1个代表个通道的数字)。那么FD_SET就将这个sockfd的数值当作rfds的数组下标。将rfds中对应sockfd这个下表位置的值改成1。 表示select监听I/O事件的时候,只管这个sockfd对应位置,其他位置的I/O事件他不管。如果有多个sockfd要监听,就FD_SET多次,然后将各个sockfd都设置到rfds中去。
关于FD_ISSET函数
int maxfd = sockfd;
int clientfd =