#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ip "127.0.0.1"
#define port 8888
#define maxsize 3
int main(int argc, char* ar**)
//防止埠復用
int reuse = 1 ;
setsockopt(sfd, sol_socket, so_reuseaddr, (void*)&reuse, sizeof(reuse));
//初始化socket
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_port = htons(port) ;
servaddr.sin_addr.s_addr = inet_addr(ip);
//繫結套接字
if(bind(sfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
//監聽套接字
if(listen(sfd, 5) == -1)
int epfd = epoll_create(maxsize);
if(epfd == -1)
struct epoll_event ev;
ev.data.fd = sfd;
ev.events = epollin;
if(epoll_ctl(epfd, epoll_ctl_add, sfd, &ev) == -1)
int nfd;
struct epoll_event evlist[maxsize];
//evlist = &ev;
while(1)
for(int i = 0; i < nfd; ++i)
}else
if(readn == 0)
else}}
} }close(epfd);
close(sfd);
return 0;
}
epoll有邊界觸發和水平觸發兩種方式,select/poll只有一種
et會把進來的連線和資料一次給你,如果你一次沒有全部取完下次就不會給你了,lt只要這次沒有被取走下次還能取到,et觸發系統呼叫次數少
兩者的區別:
比如說你從某寶下單買了幾個東西,這幾個東西分別由n個快遞員分別給你送過來。在某一時刻,你開始等快遞。
對於select/poll,就是你在睡覺的時候,收到一條簡訊「你有快遞到了,取一下」,但不知道傳送方是誰(但一定是那n個快遞員中的某人/某幾個人給你發的),所以你必須挨個給那n個快遞員分別打個**,問他們,是不是我的快遞已經到了。
至於select/poll的區別,類似於你和快遞員都分別有兩個手機號,乙個移動,乙個聯通,其區別就在於你用哪個手機號給他們打的問題。
對於epoll,是你收到那條簡訊的時候,看到了傳送方的**號碼,你就可以直接給他打**,問他在哪兒,你好去去快遞。
還可以形象一點
select/poll
飯店服務員(核心)告訴飯店老闆(使用者程式):」現在有客人結賬「
但是這個服務員沒人明確告訴老闆,哪幾桌的客人結帳。老闆得自兒乙個乙個桌子去問:請問是你要結帳?
epoll
飯店服務員(核心)告訴飯店老闆(使用者程式):」1,2,5號客人結賬「
老闆就可以直接去1,2,5號桌收錢了
epoll使用例項說明
之前一直在講如何epoll如何好用,但是並沒有例項來演示epoll的使用,下面我們就看乙個伺服器端使用epoll監聽大量併發鏈結的例子。首先看一下epoll的幾個函式的介紹。1 epoll create函式 intepoll create intsize 2 epoll ctl函式 brief 該函...
epoll模型例項
epoll有兩種模式,edge triggered 簡稱et 和 level triggered 簡稱lt 在採用這兩種模式時要注意的是,如果採用et模式,那麼僅當狀態發生變化時才會通知,而採用lt模式類似於原來的 select poll操作,只要還有沒有處理的事件就會一直通知.以 來說明問題 首先...
epoll監聽檔案 epoll的使用
epoll i o event notification facility 在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為...