計算機網路 I O多路轉接之epoll

2021-07-29 12:58:34 字數 3332 閱讀 2522

什麼是epoll

epoll是什麼?按照man手冊的說法:是為處理大批量控制代碼而作了改進的poll。當然,這不是2.6核心才有的,它是在2.5.44核心中被引進的(epoll(4) is a new api introduced in linux kernel2.5.44),它幾乎具備了之前所說的一切優點,被公認為linux2.6下效能最好的多路i/o就緒通知方法。

epoll的相關系統呼叫

epoll只有epoll_create,epoll_ctl,epoll_wait 3個系統呼叫。

1. int epoll_create(int size);

建立乙個epoll的控制代碼。自從linux2.6.8之後,size引數是被忽略的。需要注意的是,當建立好epoll控制代碼後,它就是會占用乙個fd值,在linux下如果檢視/proc/程序id/fd/,是能夠看到這個fd的,所以在使用完epoll後,必須呼叫close()關閉,否則可能導致fd被耗盡。

2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

epoll的事件註冊函式,它不同於select()是在監聽事件時告訴核心要監聽什麼型別的事件,而是在這裡先註冊要監聽的事件型別。第乙個引數是epoll_create()的返回值。第二個引數表示動作,用三個巨集來表示:epoll_ctl_add:註冊新的fd到epfd中;

epoll_ctl_mod:修改已經註冊的fd的監聽事件;

epoll_ctl_del:從epfd中刪除.乙個fd;

第三個引數是需要監聽的fd。

第四個引數是告訴核心需要監聽什麼事,struct epoll_event結構如下:

events可以是以下幾個巨集的集合:

epollin :表示對應的檔案描述符可以讀(包括對端socket正常關閉);

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

epollpri:表示對應的檔案描述符有緊急的資料可讀(這裡應該表示有帶外資料到來);

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

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

epollet: 將epoll設為邊緣觸發(edge triggered)模式,這是相對於水平觸發(leveltriggered)來說的。

epolloneshot:只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需要再次把這個socket加⼊入到epoll佇列裡

3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

收集在epoll監控的事件中已經傳送的事件。引數events是分配好的epoll_event結構體陣列,epoll將會把發生的事件賦值到events陣列中(events不可以是空指標,核心只負責把資料複製到這個events陣列中,不會去幫助我們在使用者態中分配記憶體)。maxevents告之核心這個

events有多大,這個 maxevents的值不能大於建立epoll_create()時的size,引數timeout是超時時間(毫秒,0會立即返回,-1將不確定,也有說法說是永久阻塞)。如果函式呼叫成功,返回對應i/o上已準備好的⽂檔案描述符數目,如返回0表示已超時。

epoll.c**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define _size_ 10240

typedef

struct epbufepbuf_t,*epbuf_p,**epbuf_pp;

static epbuf_p alloc_epbuf(int fd)

ptr->fd=fd;

return ptr;

}static

void del_epbuf(epbuf_p ptr)

}int startup(const

char* _ip,int _port)

int opt=1;

setsockopt(sock,sol_socket,so_reuseaddr,&opt,sizeof(opt));

struct sockaddr_in local;

local.sin_family=af_inet;

local.sin_port=htons(_port);

local.sin_addr.s_addr=inet_addr(_ip);

if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)

if(listen(sock,5)<0)

return sock;

}int main(int argc,char* argv)

int listen_sock=startup(argv[1],atoi(argv[2]));

int epfd=epoll_create(256);

if(epfd<0)

struct epoll_event _ev;

_ev.events=epollin|epollet;

_ev.data.ptr=alloc_epbuf(listen_sock);

epoll_ctl(epfd,epoll_ctl_add,listen_sock,&_ev);

while(1)

_ev.events=epollin;

_ev.data.ptr=alloc_epbuf(new_sock);

epoll_ctl(epfd,epoll_ctl_add,new_sock,&_ev);

}else

if(fd!=listen_sock&&\

(evs[i].events&epollin))

else

if(_s==0)

else

}else

if(fd!=listen_sock&&(evs[i].events&epollout))

else}}

break;}}

return

0;}

計算機網路9 計算機網路效能

1.網路效能的衡量指標 2.速率 3.頻寬 4.延遲 5.丟包率 6.時延頻寬積 7.吞吐率 網路效能的好壞可以由網路的速率 頻寬 延遲 丟包率 網路頻寬積 吞吐率等方面來判斷,下面讓我們一一詳細介紹。速率 資料率 data rate 也稱 資料傳輸速率或位元率 bit rate 指的是 單位時間 ...

計算機網路 計算機網路的效能

目錄 1.網路效能的衡量指標 2.速率 3.頻寬 4.延遲 5.丟包率 6.時延頻寬積 7.吞吐率 網路效能的好壞可以由網路的速率 頻寬 延遲 丟包率 網路頻寬積 吞吐率等方面來判斷,下面讓我們一一詳細介紹。速率 資料率 data rate 也稱 資料傳輸速率或位元率 bit rate 指的是 單位...

計算機網路學習 計算機網路效能

出自 1.網路效能的衡量指標 2.速率 3.頻寬 4.延遲 5.丟包率 6.時延頻寬積 7.吞吐率 網路效能的好壞可以由網路的速率 頻寬 延遲 丟包率 網路頻寬積 吞吐率等方面來判斷,下面讓我們一一詳細介紹。速率 資料率 data rate 也稱 資料傳輸速率或位元率 bit rate 指的是 單位...