完整**在我個人github上歡迎fork
#include #include #include #include #include #include #include #include #include #include #include #define max_events 1024
#define buflen 128
#define serv_port 8080
/* * status:1表示在監聽事件中,0表示不在
* last_active:記錄最後一次響應時間,做超時處理
*/struct myevent_s ;
int g_efd; /* epoll_create返回的控制代碼 */
struct myevent_s g_events[max_events+1]; /* +1 最後乙個用於 listen fd */
//初始化乙個事件
void eventset(struct myevent_s *ev, int fd, void (*call_back)(int, int, void *), void *arg)
void recvdata(int fd, int events, void *arg);
void senddata(int fd, int events, void *arg);
void eventadd(int efd, int events, struct myevent_s *ev)
}; int op;
epv.data.ptr = ev;
epv.events = ev->events = events;
if (ev->status == 1)
else
if (epoll_ctl(efd, op, ev->fd, &epv) < 0)
printf("event add failed [fd=%d], events[%d]\n", ev->fd, events);
else
printf("event add ok [fd=%d], op=%d, events[%0x]\n", ev->fd, op, events);
return;
}void eventdel(int efd, struct myevent_s *ev)
}; if (ev->status != 1)
return;
epv.data.ptr = ev;
ev->status = 0;
epoll_ctl(efd, epoll_ctl_del, ev->fd, &epv);
return;
}void acceptconn(int lfd, int events, void *arg)
printf("%s: accept, %s\n", __func__, strerror(errno));
return;
}do
if (i == max_events)
int flag = 0;
if ((flag = fcntl(cfd, f_setfl, o_nonblock)) < 0)
//accept成功
eventset(&g_events[i], cfd, recvdata, &g_events[i]);
eventadd(g_efd, epollin, &g_events[i]);
} while(0);
printf("new connect [%s:%d][time:%ld], pos[%d]\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), g_events[i].last_active, i);
return;
}void recvdata(int fd, int events, void *arg)
else if (len == 0)
else
return;
}void senddata(int fd, int events, void *arg)
else
return;
}void initlistensocket(int efd, short port)
int main(int argc, char *argv)
}/* 等待事件發生 */
int nfd = epoll_wait(g_efd, events, max_events+1, 1000);
if (nfd < 0)
for (i = 0; i < nfd; i++)
if ((events[i].events & epollout) && (ev->events & epollout)) }}
/* 退出前釋放所有資源 */
epoll反應堆模型
參考 參考 求職期間,還是得好好學習。看了大概的思路,自己理解著敲一下。和原來 的有些地方不同。include include include include include include include include include define max events 1024 監聽上限 de...
epoll反應堆理解
反應堆伺服器 接收客戶端的資訊,然後傳送回去 監聽到事件才做對應的 函式,這是reactor乙個固定的正規化,不能太隨心所欲.當然可以在readdata裡write client fd 但不符合正規化.而且,回想一下epoll的作用 幫助程序監聽檔案描述符 是否可寫或可讀,只有epoll給你監聽到可...
epoll反應堆模型實現
在高併發tcp請求中,為了實現資源的節省,效率的提公升,epoll逐漸替代了之前的select和poll,它在使用者層上規避了忙輪詢這種效率不高的監聽方式,epoll的時間複雜度為o 1 也就意味著,epoll在高併發場景,隨著檔案描述符的增長,有良好的可擴充套件性。關鍵函式有三個 核心資料結構 t...