select 和 epoll 區別
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
,便會輪詢檢查。
}