多路復用 epoll

2021-09-02 22:50:37 字數 1858 閱讀 2092

//這是乙個基於epoll多路復用的服務端

#include#include#include#include#include#include#include#include#include#includeint recv_data(int fd,char *buff)

else if(errno==eintr)

return -1;

}else if(ret<2)

alen+=ret;

}}int main(int argc,char *argv)

int i=0;

char buff[1024]=;

int sockfd=socket(af_inet,sock_stream,0);

if(sockfd<0)

struct sockaddr_in srv_addr;

struct sockaddr_in cli_addr;

srv_addr.sin_family=af_inet;

srv_addr.sin_port=htons(atoi(argv[2]));

srv_addr.sin_addr.s_addr=inet_addr(argv[1]);

socklen_t len=sizeof(struct sockaddr_in);

int ret=bind(sockfd,(struct sockaddr*)&srv_addr,len);

if(ret<0)

if(listen(sockfd,5)<0)

int epfd=epoll_create(10);

//在核心建立eventpoll結構 size只要大於0就可以返回的是epoll控制代碼

if(epfd<0)

struct epoll_event ev;

ev.events=epollin;

ev.data.fd=sockfd;

epoll_ctl(epfd,epoll_ctl_add,sockfd,&ev);

//epoll_ctl 向核心中新增事件函式

//epfd epoll的控制代碼

//第二個引數為當前要進行的操作函式

//epoll_ctl_add 新增事件

//epoll_ctl_mod 修改事件

//epoll_ctl_del 刪除事件

//第三個引數是所監控的檔案描述符

//第四個引數為所關聯的事件

//epollin 可讀事件

//epollout 可寫事件

//epollet 邊緣觸發屬性

//每當有新資料到來的時候時間就會觸發,如果這次沒有讀取完,也就是還有資料需要處理,但是不會再進行提醒。所以這種特性下我們需要一次性把緩衝區內的資料全部讀完。

//epolllt 水平觸發特性

//水平特性和邊緣正好相反,只要緩衝區中有資料可以讀取就不斷的讀,預設是水平觸發特性

while(1)

else if(nfds==0)

for(i=0;iev.events=epollin|epollet;

ev.data.fd=new_fd;

epoll_ctl(epfd,epoll_ctl_add,new_fd,&ev);

}else

;ret=recv_data(evs[i].data.fd,buff);

if(ret<=0)

epoll_ctl(epfd,epoll_ctl_del,evs[i].data.fd,&ev);

close(evs[i].data.fd);

}printf("client say:%s\n",buff);}}

}close(sockfd);

return 0;

}

epoll多路復用

1 基本知識 epoll是在2.6核心中提出的,是之前的select和poll的增強版本。相對於select和poll來說,epoll更加靈活,沒有描述符限制。epoll使用乙個檔案描述符管理多個描述符,將使用者關係的檔案描述符的事件存放到核心的乙個事件表中,這樣在使用者空間和核心空間的copy只需...

LinuxIO多路復用之epoll

談到epoll,首先談一下select和poll,我們發現這兩種方式儲存監聽檔案描述符的方式為陣列 然後返回的是監聽描述符中就緒的個數 我們如果要進行處理 我們還得去監聽檔案描述符的陣列乙個乙個遍歷 去判斷哪個檔案描述符就緒 才去處理資料 而epoll內部用於儲存監聽檔案描述符的資料型別為紅黑樹 樹...

多路復用模型之epoll

作為多路復用io模型,epoll致力於解決select與poll設計缺陷以提公升系統併發能力。1 併發效率不隨文句柄數上公升而線性下降 epoll避免了select模型中對所有每次所有檔案描述符控制代碼輪詢。它的底層採用紅黑樹記錄所有檔案控制代碼,並將活躍的連線存放至鍊錶中,在處理io事件時,只需遍...