/*
反應堆伺服器: 接收客戶端的資訊,然後傳送回去
監聽到事件才做對應的**函式,這是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 ...