epoll是tcp/ip網路程式設計的io服用方法之中一種優於select的函式,相比select,它有兩個優點:
1.無需編寫以監視狀態變化為目的的針對所有檔案描述符的迴圈語句。
2.呼叫對應於select函式的epoll_wait函式時無需每次傳遞監視物件資訊。
下面介紹epoll伺服器端實現中需要的三個函式,希望各位結合epoll函式的優點理解這些函式的功能。
epoll_create:建立儲存epoll檔案描述符的空間。
epoll_ctl:向空間註冊並登出檔案描述符。
epoll_wait:等待檔案描述符發生變化。
此外還需要一種結構體:epoll_event將發生變化的檔案描述符單獨集中到一起。
struct epoll_event
用法:
#include
#include
#include
#include
#include
#include
#include
void error_handling(char *message);
#define buff_size 100
#define epoll_size 30
int main(int argc, char *argv)
//呼叫socket函式建立套接字
sock_server = socket(pf_inet, sock_stream, 0);
if(-1 == sock_server)
memset(&addr_server, 0, sizeof(addr_server));
addr_server.sin_family = af_inet;
addr_server.sin_addr.s_addr = htonl(inaddr_any);
addr_server.sin_port = htons(atoi(argv[1]));
//呼叫bind函式分配ip位址和埠號
if( -1 == bind( sock_server, (struct sockaddr*)&addr_server,
sizeof(addr_server)) )
//監聽埠的連線請求,連線請求等待佇列size為5
if( -1 == listen(sock_server, 5) )
//epoll
epfd = epoll_create(epoll_size);
//epfd = epoll_create(0); //epoll_wait() error
ep_events = (struct epoll_event*)malloc(sizeof(struct epoll_event)*epoll_size);
event.events = epollin;//監視需用讀取資料事件
event.data.fd=sock_server;
epoll_ctl(epfd, epoll_ctl_add, sock_server, &event);
//while(1)
for(i=0; iif(ep_events[i].data.fd == sock_server)elseelse
}//end of if()
}//end of while
}//end of for
//斷開連線,關閉套接字
close(sock_server);
close(epfd);//
return0;}
void error_handling(char *message)
linux下select和epoll函式總結
多路io轉接伺服器實現的主旨思想是,不再由應用程式自己監視客戶端連線,取而代之由核心替應用程式監視檔案。select函式 int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeou...
Linux事件觸發 epoll相關函式
在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為在核心中的select實現中,它是採用輪詢來處理的,輪詢的fd數目越多,自然...
Linux下I O多路轉接之epoll
linux下i o多路轉接之epoll epoll i o event notification facility 在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不...