參考 <>
參考 <>
求職期間,還是得好好學習。
看了大概的思路,自己理解著敲一下。和原來**的有些地方不同。
#include #include #include #include #include #include #include #include #include #define max_events 1024 /*監聽上限*/
#define buflen 4096 /*快取區大小*/
#define serv_port 6666 /*埠號*/
/*描述就緒檔案描述符的相關資訊*/
struct myevent_s;
int g_efd; //全域性變數,作為紅黑樹根
struct myevent_s g_events[max_events+1]; //自定義結構體型別陣列. +1-->listen fd
void eventinit(struct myevent_s *ev,int fd,void *arg)
void eventadd(int efd,struct myevent_s *ev,int events,void (*callbak)(int fd,int events,void* arg))
struct epoll_event epv;
int op;
ev->events = events;
ev->callbak = callbak;
ev->last_active = time(null);
epv.data.ptr = (void*)ev;
epv.events = events;
op = epoll_ctl_add;
ev->status = 1;
epoll_ctl(efd,op,ev->fd,&epv);
return;
}void eventdel(int efd,struct myevent_s *ev)
void senddata(int fd, int events, void *arg);
void recvdata(int fd, int events, void *arg);
void recvdata(int fd, int events, void *arg)
else if(ev->len == 0)elseelse
}return;
}void senddata(int fd, int events, void *arg)
else if(len == 0)elseelse
}return;
}void acceptconn(int fd,int events,void *arg)
char buf[20];
printf("accpet %s:%d\n",
inet_ntop(af_inet,&client_addr.sin_addr,buf,sizeof(buf)),
ntohs(client_addr.sin_port));
int i;
for(i=0;i= 60)}}
for(i=0;ievents & epollin))
//如果監聽的是寫事件,並返回的是寫事件
else if((events[i].events & epollout) && (ev->events & epollout))}}
}
epoll反應堆模型實現
在高併發tcp請求中,為了實現資源的節省,效率的提公升,epoll逐漸替代了之前的select和poll,它在使用者層上規避了忙輪詢這種效率不高的監聽方式,epoll的時間複雜度為o 1 也就意味著,epoll在高併發場景,隨著檔案描述符的增長,有良好的可擴充套件性。關鍵函式有三個 核心資料結構 t...
epoll反應堆理解
反應堆伺服器 接收客戶端的資訊,然後傳送回去 監聽到事件才做對應的 函式,這是reactor乙個固定的正規化,不能太隨心所欲.當然可以在readdata裡write client fd 但不符合正規化.而且,回想一下epoll的作用 幫助程序監聽檔案描述符 是否可寫或可讀,只有epoll給你監聽到可...
reactor 反應堆模型
1.reactor模型,本質上講管理網路io 使用下面這個結構用來管理我們的io struct ntyreactor 下面這段 比較核心 我們關心的事件與發生的事件發生時,才去呼叫 2.實現 include include include include include include includ...