关于select函数:
其函数原型为: int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 此函数的功能是由内核检测在timeout时间内,是否有readfds,writefds,exceptfds三个句柄集(file descriptors)里的某个句柄(file descriptor)的状态符合寻求,即readfds句柄集里有句柄可读或writefds句柄集里有可写或exceptfds句柄集里有例外发生,任何一个有变化函数就立即返回,返回值为timeout发生状态变化的句柄个数。 n是所有readfds,writefds,exceptfds三个句柄集(file descriptors)里编号最大值加1。比如:要检测两个socket句柄fd1和fd2在timeout时间内是否分别可读和可写就可以这样: 先把两个句柄集(file descriptors)清零: FD_ZERO (&readfds); FD_ZERO (&writefds); 然后把fd1加入读检测集: FD_SET (fd1, &readfds); 然后把fd2加入写检测集: FD_SET (fd2, &writefds); 再给timeout设置值,timeout是这样的一个结构: struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ }; 你可以这样赋值: timeout.tv_sec=1; timeout.tv_uec=0; 表示检测在1秒钟内是否有句柄状态发生变化。 如果有句柄发生变化,就可以用FD_ISSET检测各个句柄,比如: FD_ISSET (fd1, &readfds);//检测是否fd1变成可读的了 FD_ISSET (fd2, &writefds);//检测是否fd2变成可写的了 示意程序代码如下:
|
|
来自: skywood > 《sourceCode》