epoll使用例項說明

2021-05-24 12:26:07 字數 4475 閱讀 8310

之前一直在講如何epoll如何好用,但是並沒有例項來演示epoll的使用,下面我們就看乙個伺服器端使用epoll監聽大量併發鏈結的例子。

首先看一下epoll的幾個函式的介紹。

1、epoll_create函式

intepoll_create(intsize);

2、epoll_ctl函式

/** 

* @brief    該函式用於控制某個epoll檔案描述符上的事件,可以註冊事件,修改事件,刪除事件。

* * @param    epfd    由 epoll_create 生成的epoll專用的檔案描述符

* @param    op      要進行的操作例如註冊事件,可能的取值epoll_ctl_add 註冊、epoll_ctl_mod 修 改、epoll_ctl_del 刪除

* @param    fd      關聯的檔案描述符

* @param    event   指向epoll_event的指標

* * @return   0       succ

*           -1      fail

*/intepoll_ctl(intepfd,intop,intfd,structepoll_event *event);

其中用到的資料結構結構如下:

typedefunionepoll_data epoll_data_t; 

structepoll_event ;

常用的事件型別:

epollin :表示對應的檔案描述符可以讀;

epollout:表示對應的檔案描述符可以寫;

epollpri:表示對應的檔案描述符有緊急的資料可讀

epollerr:表示對應的檔案描述符發生錯誤;

epollhup:表示對應的檔案描述符被結束通話;

epollet: 表示對應的檔案描述符有事件發生; 例:

structepoll_event ev;

//設定與要處理的事件相關的檔案描述符

ev.data.fd=listenfd;

//設定要處理的事件型別

ev.events=epollin|epollet;

//註冊epoll事件

epoll_ctl(epfd,epoll_ctl_add,listenfd,&ev);

3、epoll_wait函式

/** 

* @brief    該函式用於輪詢i/o事件的發生

* * @param    epfd        由epoll_create 生成的epoll專用的檔案描述符

* @param    events      用於回傳代處理事件的陣列

* @param    maxevents   每次能處理的事件數

* @param    timeout     等待i/o事件發生的超時值;-1相當於阻塞,0相當於非阻塞。一般用-1即可

* * @return   >=0         返回發生事件數

*           -1          錯誤

*/intepoll_wait(intepfd,structepoll_event * events,intmaxevents,inttimeout);

好了,其實在epoll的使用中無非就用到了上面介紹的幾個函式,下面貼一段用epoll實現的伺服器**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#definemaxbuf 1024

#definemaxepollsize 10000

/*setnonblocking - 設定控制代碼為非阻塞方式

*/intsetnonblocking(intsockfd)

return0;}/*

handle_message - 處理每個 socket 上的訊息收發

*/inthandle_message(intnew_fd)

else

/* 處理每個新連線上的資料收發結束 */

returnlen;

}intmain(intargc,char*

*argv)

else

/* 開啟 socket 監聽 */

if((listener = socket(pf_inet, sock_stream, 0)) ==-1)

else

setnonblocking(listener);

bzero(&my_addr,sizeof(my_addr));

my_addr.sin_family = pf_inet;

my_addr.sin_port = htons(myport);

my_addr.sin_addr.s_addr = inaddr_any;

if(bind(listener, (structsockaddr *) &my_addr,sizeof(structsockaddr)) ==

-1) 

else

if(listen(listener, lisnum) ==

-1) 

else

/* 建立 epoll 控制代碼,把監聽 socket 加入到 epoll 集合裡 */

kdpfd = epoll_create(maxepollsize);

len =

sizeof(structsockaddr_in);

ev.events = epollin | epollet;

ev.data.fd = listener;

if(epoll_ctl(kdpfd, epoll_ctl_add, listener, &ev) <

0)else

curfds =

1;while(1) 

/* 處理所有事件 */

for(n =

0; n < nfds; ++n)

else

setnonblocking(new_fd);

ev.events = epollin | epollet;

ev.data.fd = new_fd;

if(epoll_ctl(kdpfd, epoll_ctl_add, new_fd, &ev) <

0)curfds++;

}else}}

}close(listener);

return0;}

ok,基本到這裡epoll的使用也就明朗了,希望對大家有用~

epoll使用例項

include include include include include include include include include include include include include include include include include define ip 127....

epoll模型例項

epoll有兩種模式,edge triggered 簡稱et 和 level triggered 簡稱lt 在採用這兩種模式時要注意的是,如果採用et模式,那麼僅當狀態發生變化時才會通知,而採用lt模式類似於原來的 select poll操作,只要還有沒有處理的事件就會一直通知.以 來說明問題 首先...

epoll簡單說明

首先我們來定義流的概念,乙個流可以是檔案,socket,pipe等等可以進行i o操作的核心物件。不管是檔案,還是套接字,還是管道,我們都可以把他們看作流。之後我們來討論i o的操作,通過read,我們可以從流中讀入資料 通過write,我們可以往流寫入資料。現在假定乙個情形,我們需要從流中讀資料,...