網路程式設計 多路I O轉接伺服器之epoll

2021-10-05 14:01:43 字數 2399 閱讀 5924

相關api

建立乙個epoll控制代碼,引數size用來告訴核心監聽的檔案描述符的個數,跟記憶體大小有關。此步驟建立乙個建議大小為size的紅黑樹(二叉平衡樹),返回值為根結點的fd

#include

intepoll_create

(int size) size:監聽數目

控制某個epoll監控的檔案描述符上的事件:註冊、修改、刪除。此步驟向根結點增加,刪除修改節點等

#include

intepoll_ctl

(int epfd,

int op,

int fd,

struct epoll_event *event)

epfd: 為epoll_creat的控制代碼

op: 表示動作,用3個巨集來表示:

epoll_ctl_add (註冊新的fd到epfd),

epoll_ctl_mod (修改已經註冊的fd的監聽事件),

epoll_ctl_del (從epfd刪除乙個fd);

event: 告訴核心需要監聽的事件

struct epoll_event

;typedef

union epoll_data epoll_data_t;

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

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

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

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

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

epollet: 將epoll設為邊緣觸發(edge triggered)模式,這是相對於水平觸發(level triggered)而言的

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

等待所監控檔案描述符上有事件的產生,類似於select()呼叫。

#include

intepoll_wait

(int epfd,

struct epoll_event *events,

int maxevents,

int timeout)

events: 用來存核心得到事件的集合,

maxevents: 告之核心這個events有多大,這個maxevents的值不能大於建立epoll_create

()時的size,

timeout: 是超時時間

-1:阻塞

0: 立即返回,非阻塞

>

0 :指定毫秒

返回值: 成功返回有多少檔案描述符就緒,時間到時返回0,出錯返回-

1

**

#include

#include

#include

#include

#include

#include

// sockaddr_in

#include

#include

#include

#include

#include

#define port 6666

#define open_max 1024

intmain()

char ip[bufsiz]

;printf

("client ip: %s, port : %d\n"

,inet_ntop

(af_inet,

&cli_addr.sin_addr.s_addr, ip,

sizeof

(ip)),

ntohs

(cli_addr.sin_port));

temp_event.events = epollin;

temp_event.data.fd = connect_fd;

epoll_ctl

(epfd, epoll_ctl_add,

//向樹上新增節點

connect_fd,

&temp_event);}

else

else

if(n ==0)

else

write

(socket_fd, buf, n)

;write

(stdout_fileno, buf, n);}

}}}}

close

(listen_fd)

;return0;

}

網路程式設計 多路I O轉接伺服器之select

思路 利用select 函式監聽資訊,accept 函式非阻塞的建立連線。相關api include according to earlier standards include include include intselect int nfds,fd set readfds,fd set wri...

I O多路轉接之poll伺服器

函式說明 include int poll struct pollfd fds,nfds t nfds,int timeout 引數說明 fds 是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符 每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便 ...

I O多路轉接 epoll伺服器

在前面的兩篇部落格中,我們介紹了最早期的select和改進版的poll 但是,他兩都沒有改進的就是,想要快速知道事件就緒並沒有得到改進,兩個全部是遍歷陣列,我們都知道它的時間複雜度就是o n 效率不是很高,時間複雜度達到o 1 才是高效的 epoll是linux特有的i o復用函式,它在實現和使用上...