winsock中select的作用
1.可以读取的sockets.当这些socket被返回时,在这些socket上执行recv/accept等操作不会产生阻塞;
2.可以写入的sockets.当这些socket被返回时,在这些socket上执行send等不会产生阻塞;
3.返回错误的sockets.
同时和select配对使用的还有:
FD_CLR(s, *set) //从set中删除套接字s
FD_ISSET(s, *set) //检查s是否set集合的一名成员;答案是肯定的,则返回TRUE
FD_SET(s, *set) //将套接字s加入集合set
FD_ZERO(*set) //将set初始化成空集合
code:
SOCKET s;
fd_set fdread;
int ret;
while(TRUE)
{
FD_ZERO(&fdread);
FD_SET(s, &fdread);
if((ret=select(0, &fdread, NULL, NULL, NULL))
{
//Error condition
}
if(ret>0)
{
if(FD_ISSET(s, &fdread))
{
//a read event has occurred on socket s
}
}
}
//select原型
int select(
int nfds, //被忽略,为保持与早期的Berkeley套接字应用程序的兼容
fd_set FAR* readfds, //检查可读性
fd_set FAR* writefds, //检查可写性
fd_set FAR*exceptfds, //例外数据
const struct timeval FAR* timeout
);
//readfds集合包括符合下述任何一条件的套接字:
1.有数据读入 2.连接已经关闭,重设或中止
3.假如已调用了listen,而且一个连接正在建立,那么accept函数调用会成功
//exceptfds集合包括符合下述任何一个条件的套接字
1.假如已完成了对一个非锁定连接调用的处理,连接尝试就会失败
2.有带外数据可供读取