epoll模型同樣委託核心做io檢測。過程與select基本相同,但是實現的方式不同。
#include #include #include #include #include #include #include #include #include #include #include void out_addr(struct sockaddr_in *clientaddr)
int main(int argc, char *ar**)
// af_inet: ipv4
// sock_stream: tcp
int lfd = socket(af_inet, sock_stream, 0);
if(lfd < 0)
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = af_inet;
serveraddr.sin_port = htons(atoi(ar**[1]));
serveraddr.sin_addr.s_addr = inaddr_any;
if(bind(lfd,(struct sockaddr*)&serveraddr,
sizeof(serveraddr))<0)
if(listen(lfd,36) <0)
printf("start accept ......\n");
struct sockaddr_in client_addr;
socklen_t cli_len = sizeof(client_addr);
// 建立乙個樹的根節點
int epfd = epoll_create(2000);
// 建立乙個樹的節點
struct epoll_event ev;
ev.events = epollin; // 監聽可讀事件
ev.data.fd = lfd; // 伺服器的檔案描述符
epoll_ctl(epfd,epoll_ctl_add,lfd,&ev); // 掛在epoll樹上
struct epoll_event all[2000]; // epoll事件陣列
while(1)
// 將客戶端的cfd掛到epoll樹上
struct epoll_event temp;
temp.events = epollin;
temp.data.fd = cfd;
epoll_ctl(epfd,epoll_ctl_add,cfd,&temp);
out_addr(&client_addr);
}else;
int len = recv(fd,buf,sizeof(buf),0);
if(len ==-1)
else if(len==0)
close(fd);
}else}}
} return 0;
}
linux C epoll 水平觸發與邊緣觸發詳解
poll有兩種觸發方式 水平觸發與邊緣觸發的區別 水平觸發 只要緩衝區有資料就會一直觸發 邊沿觸發 只有在緩衝區增加資料的那一刻才會觸發 使用邊沿觸發 include include include include include int main int argc,char ar return 0...
網路 OSI模型 TCP IP 模型
了解這一部分前,先認識了兩個概念 計算機網路是通過傳輸介質 通訊設施和通訊協議,將分散在不同點的計算機裝置互聯起來實現資源共享和資料傳輸的系統。網路程式設計就是編寫程式使聯網的兩個或多個裝置直接進行傳輸 國際標準組織提出網路開發互聯模型osi open system interconnect 將網路...
Select網路模型
mysockt.h pragma once define maxnum 64 include pragma comment lib,ws2 32.lib define um user wm user 1 向視窗發訊息 enum nettype class cmysocket mysocket.cpp...