水平觸發模式
#include #include #include #include #include #include #include #include #include int main(int argc,const char* ar**)
struct sockaddr_in serv_addr;
socklen_t serv_len = sizeof(serv_addr);
int port = atoi(ar**[1]);
//建立套接字
int lfd = socket(af_inet,sock_stream,0);
//初始化socket_in
memset(&serv_addr,0,serv_len);
serv_addr.sin_family = af_inet; //位址族
serv_addr.sin_addr.s_addr = htonl(inaddr_any); //監聽本機所有的ip
serv_addr.sin_port = htons(port); //設定埠
//繫結埠和ip
bind(lfd,(struct sockaddr*)&serv_addr,serv_len);
//設定同時監聽的最大個數
listen(lfd,36);
printf("start accept ...\n");
struct sockaddr_in client_addr;
socklen_t cli_len = sizeof(client_addr);
//建立epoll樹根節點
int epfd = epoll_create(2000);
//初始化epoll樹
struct epoll_event ev;
ev.events = epollin; //邊沿模式;
ev.data.fd = lfd;
epoll_ctl(epfd,epoll_ctl_add,lfd,&ev);
struct epoll_event all[2000];
while(1)
struct sockaddr_in serv_addr;
socklen_t serv_len = sizeof(serv_addr);
int port = atoi(ar**[1]);
//建立套接字
int lfd = socket(af_inet,sock_stream,0);
//初始化socket_in
memset(&serv_addr,0,serv_len);
serv_addr.sin_family = af_inet; //位址族
serv_addr.sin_addr.s_addr = htonl(inaddr_any); //監聽本機所有的ip
serv_addr.sin_port = htons(port); //設定埠
//繫結埠和ip
bind(lfd,(struct sockaddr*)&serv_addr,serv_len);
//設定同時監聽的最大個數
listen(lfd,36);
printf("start accept ...\n");
struct sockaddr_in client_addr;
socklen_t cli_len = sizeof(client_addr);
//建立epoll樹根節點
int epfd = epoll_create(2000);
//初始化epoll樹
struct epoll_event ev;
ev.events = epollin | epollet; //邊沿模式;
ev.data.fd = lfd;
epoll_ctl(epfd,epoll_ctl_add,lfd,&ev);
struct epoll_event all[2000];
while(1)
struct sockaddr_in serv_addr;
socklen_t serv_len = sizeof(serv_addr);
int port = atoi(ar**[1]);
//建立套接字
int lfd = socket(af_inet,sock_stream,0);
//初始化socket_in
memset(&serv_addr,0,serv_len);
serv_addr.sin_family = af_inet; //位址族
serv_addr.sin_addr.s_addr = htonl(inaddr_any); //監聽本機所有的ip
serv_addr.sin_port = htons(port); //設定埠
//繫結埠和ip
bind(lfd,(struct sockaddr*)&serv_addr,serv_len);
//設定同時監聽的最大個數
listen(lfd,36);
printf("start accept ...\n");
struct sockaddr_in client_addr;
socklen_t cli_len = sizeof(client_addr);
//建立epoll樹根節點
int epfd = epoll_create(2000);
//初始化epoll樹
struct epoll_event ev;
ev.events = epollin;
ev.data.fd = lfd;
epoll_ctl(epfd,epoll_ctl_add,lfd,&ev);
struct epoll_event all[2000];
while(1)
if(len == -1)else
}else if(len ==0)
close(fd);}}
} }close(lfd);
return 0;
}
可以使用nc進行測試 epoll模型例項
epoll有兩種模式,edge triggered 簡稱et 和 level triggered 簡稱lt 在採用這兩種模式時要注意的是,如果採用et模式,那麼僅當狀態發生變化時才會通知,而採用lt模式類似於原來的 select poll操作,只要還有沒有處理的事件就會一直通知.以 來說明問題 首先...
Epoll 模型實現
while true else if m events i data.fd m listen sock fd 如果新監測到乙個socket使用者連線到了繫結的socket埠,建立新的連線。else if m events i events epollin 如果是已經連線的使用者,並且收到資料,那麼進...
Epoll模型講解
首先我們來定義流的概念,乙個流可以是檔案,socket,pipe等等可以進行i o操作的核心物件。不管是檔案,還是套接字,還是管道,我們都可以把他們看作流。之後我們來討論i o的操作,通過read,我們可以從流中讀入資料 通過write,我們可以往流寫入資料。現在假定乙個情形,我們需要從流中讀資料,...