select 和 epol 都是用来监听套接字上是否有事情发生,
select 采用轮询方式,epoll 是触发方式,用回调把信息赋给event机构体
select : 轮询检查文件描述符集合, 实现方式:
fd_set fdRead;
FD_ZERO(&fdRead); // 将文件描述符集合清零
FD_SET(iSocket,&fdRead); // 将文件描述符iSocket添加到fdRead中,可以添加多个
// select ,设置recv 超时时间
int iRet = select(iSocket+1,&fdRead,NULL,NULL,&tvTimeOUt);
swtich(iRet)
{
case 0:
printf("Time out\n");
return -1;
case -1:
printf("Select Error\n");
return -2;
default:
if(FD_ISSET(iSocket,&fdRead)) // 测试iSocket 是否在描述符集合中
{
iRecvLen = recv(iScoket,pcRecvBuf,iBufLen,0);
if(iRcvLen == -1)
{
printf("Recv error\n");
return -3;
}
else if( 0 == iRevLen)
{
printf("Scoket close\n");
return -4;
}
else{
break;
}
}
如果文件描述符中有多个socket,便会轮询检查
epoll:
epool 的使用,首先通过epoll_create创建一个epoll对象,得到一个epoll的描述符,
我们需要监听那个fd上的事件通过epoll_ctl,最后epoll_wait会返回发生了事件的数目
}
}
如果文件描述符中有多个
socket
,便会轮询检查。
}