相關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復用函式,它在實現和使用上...