//這是乙個基於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事件時,只需遍...