1. 程式人生 > >select 和 epoll 區別

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

,便會輪詢檢查。


}