1 #include"wrap.h"
2 #include
3 #include
4 #define max_event_num 1024
5 #define buff_size 1067
void delfd (
int epollfd ,
int fd)815
void
addfd
(int epollfd ,
int fd)
//fd做成結構體才能加入事件表
1623
intmain
(int argc ,
char
* ar**)
2430
const
char
* ip = ar**[1]
;31int port =
atoi
(ar**[2]
);32struct sockaddr_in saddr,caddr;
3334
int sfd =
socket
(af_inet,sock_stream,0)
;3536bzero
(&saddr,
sizeof
(saddr));
37 saddr.sin_family = af_inet;
38 saddr.sin_port =
htons
(port);39
inet_pton
(af_inet,ip ,
&saddr.sin_addr.s_addr);40
bind
(sfd,
(struct sockaddr*
)&saddr,
sizeof
(saddr));
4142
listen
(sfd,5)
;4344int epollfd =
epoll_create(5
);//建立epoll事件表的期望大小,返回事件表的根,即紅黑樹的根;
45if
(epollfd ==-1
)46perr_exit
("epoll_crete error");
4748
addfd
(epollfd , sfd)
;//封裝函式,將監聽socket加入epoll事件表;
4950
struct epoll_event events[max_event_num]
;//定義就緒事件容器;
51while(1
)5271else
//其他客戶端cfd事件分一類處理,讀寫資料
7284
if(n <0)
//接受資料出錯
8590
else
//資料轉化,並且傳送資料
9195}96
97}98}
99100
101return0;
102}
客戶端:fasdfddddddddddddddddddddddddddddddddd
伺服器:
client cfd ip =127.0.0.1 port=33254
event trigger once
get 9 bytes content:fasdfdddd
event trigger once
get 9 bytes content:ddddddddd
event trigger once
get 9 bytes content:ddddddddd
event trigger once
get 9 bytes content:ddddddddd
event trigger once
get 3 bytes content:dd
結果:lt事件未讀完事件觸發多次去讀
et模式
客戶端:fasdfddddddddddddddddddddddddddddddddd
伺服器:
client cfd ip =127.0.0.1 port=33254
event trigger once
get 9 bytes content:fasdfdddd
get 9 bytes content:ddddddddd
get 9 bytes content:ddddddddd
get 9 bytes content:ddddddddd
get 3 bytes content:dd
結果:et只是觸發一次就能讀完當前事件的內容;
在客戶傳送一大堆資料時,伺服器只需要利用epollet的buff大小來讀頭部內容,來判斷後面的大堆資料是否需要,不需要則可以直接丟棄,並且下一次event事件不會觸發;lt模式即使頭部讀完不想要後面的資料,但lt模式下一次還會觸發事件,因為沒有讀完的緣故;
epoll的ET模式和LT模式
查閱了一些資料,才知道常用的事件處理庫很多都選擇了 lt 模式,包括大家熟知的libevent和boost asio等,為什麼選擇lt呢?那就不得不從et的弊端的弊端說起。et模式下,當有事件發生時,系統只會通知你一次,也就是呼叫epoll wait 返回fd後,不管事件你處理與否,或者處理完全與否...
epoll的ET模式和LT模式
lt模式 epoll預設的工作模式。如果描述符上的事件就緒,但是它的資料沒有處理完,或者沒有處理 epoll下次會提醒他,讓他處理。換個說法,如果fd對應的緩衝區有資料,就會呼叫一次epoll wait,直到資料全部被處理完。et模式 如果描述符上的事件就緒,但是它的資料沒有處理完,或者沒有處理。e...
epoll的ET和LT模式
從man手冊中,得到et和lt的具體描述如下 epoll事件有兩種模型 edge triggered et level triggered lt 假如有這樣乙個例子 1.我們已經把乙個用來從管道中讀取資料的檔案控制代碼 rfd 新增到epoll描述符 2.這個時候從管道的另一端被寫入了2kb的資料 ...