epoll反應堆理解

2022-09-19 16:45:14 字數 2001 閱讀 1509

/*

反應堆伺服器: 接收客戶端的資訊,然後傳送回去

監聽到事件才做對應的**函式,這是reactor乙個固定的正規化,不能太隨心所欲.

當然可以在readdata裡write(client_fd),但不符合正規化. 而且,回想一下epoll的作用:幫助程序監聽檔案描述符

是否可寫或可讀,只有epoll給你監聽到可寫,你才能寫,監聽到可讀才能讀. readdata是監聽到可讀的時候, 此時是否可寫

並不知道,有可能程序因此寫阻塞!

按理說讀事件觸發了readdata裡的read,所以write也必須由寫事件來觸發,

所以有了: 先將讀到的資料存起來,改變client_fd的監聽事件為寫事件,

對應的call_back就是write, 改變監聽事件後下一次epoll_wait就能監聽到epollout, 直接call_back write

多麼順理成章!聽起來多麼順耳!

因此,在epoll中要想全雙工通訊, 要給乙個檔案描述符建立兩個節點, 乙個監聽epollin, 乙個監聽epollout

*/#include #include #include #include #include #include #include #include #include #include #include "../wrap/wrap.h"

#define _buf_len_ 1024

#define _event_size_ 1024

//全域性epoll樹的根

int gepfd = 0;

//事件驅動結構體

typedef struct xx_eventxevent;

xevent myevents[_event_size_+1];

void readdata(int fd,int events,void *arg);

/*新增事件

eventadd(lfd,epollin,initaccept,&myevents[_event_size_-1],&myevents[_event_size_-1]);

引數說明:

fd: 描述符

events : 監聽描述符要發生的事件

call_back : 如若發生該事件立馬呼叫的函式

arg : 函式的引數

ev : 上樹後struct epoll_event.data.ptr指向的結構體位址

*/void eventadd(int fd,int events,void (*call_back)(int ,int ,void *),void *arg,xevent *ev)

//修改事件

//eventset(fd,epollout,senddata,arg,ev);

void eventset(int fd,int events,void (*call_back)(int ,int ,void *),void *arg,xevent *ev)

//刪除事件

void eventdel(xevent *ev,int fd,int events)

//傳送資料

void senddata(int fd,int events,void *arg)

//讀資料

void readdata(int fd,int events,void *arg)

else if(ev->buflen==0) //對方關閉連線 }

//新連線處理

void initaccept(int fd,int events,void *arg)

}//設定讀事件

eventadd(cfd, epollin, readdata, &myevents[i], &myevents[i]);

}int main(int argc,char *ar**)

else if(nready>0) //呼叫epoll_wait成功,返回有事件發生的檔案描述符的個數}}

}//關閉監聽檔案描述符

close(lfd);

return 0;

}

epoll反應堆模型

參考 參考 求職期間,還是得好好學習。看了大概的思路,自己理解著敲一下。和原來 的有些地方不同。include include include include include include include include include define max events 1024 監聽上限 de...

epoll反應堆模型實現

在高併發tcp請求中,為了實現資源的節省,效率的提公升,epoll逐漸替代了之前的select和poll,它在使用者層上規避了忙輪詢這種效率不高的監聽方式,epoll的時間複雜度為o 1 也就意味著,epoll在高併發場景,隨著檔案描述符的增長,有良好的可擴充套件性。關鍵函式有三個 核心資料結構 t...

3 epoll反應堆複雜型

完整 在我個人github上歡迎fork include include include include include include include include include include include define max events 1024 define buflen 128 ...