之前一直在講如何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,我們可以往流寫入資料。現在假定乙個情形,我們需要從流中讀資料,...