epoll的ET模式與LT模式

2021-10-02 17:03:19 字數 2729 閱讀 9785

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的資料 ...