簡單的epoll模型

2021-09-25 21:33:42 字數 3048 閱讀 6280

水平觸發模式

#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,我們可以往流寫入資料。現在假定乙個情形,我們需要從流中讀資料,...