1. 程式人生 > 其它 >【網路程式設計】學習筆記--06 I/O多路複用之epoll

【網路程式設計】學習筆記--06 I/O多路複用之epoll

epoll的server端:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<unistd.h>
 5 #include<errno.h>
 6 #include<pthread.h>
 7 #include<ctype.h>
 8 #include<sys/socket.h>
 9 #include<sys/epoll.h>
10 #include<arpa/inet.h>
11
12 #define SERV_PORT 9527 13 #define MAXLINE 8192 14 #define OPEN_MAX 5000 15 16 int main(int argc,char *argv[]) 17 { 18 int listenfd = 0,connfd = 0,sockfd,i; 19 int n,num = 0; 20 ssize_t nready,efd,res; 21 char buf[MAXLINE], str[INET_ADDRSTRLEN]; 22 socklen_t clilen; 23 24 struct
sockaddr_in cliaddr,servaddr; 25 26 listenfd = socket(AF_INET,SOCK_STREAM,0); 27 int opt = 1; 28 setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); //埠複用 29 memset(&servaddr,0,sizeof(servaddr)); 30 servaddr.sin_family = AF_INET; 31 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
32 servaddr.sin_port = htons(SERV_PORT); 33 bind(listenfd,(struct sockaddr *)&servaddr, sizeof(servaddr)); 34 listen(listenfd,20); 35 36 efd = epoll_create(OPEN_MAX); //建立epoll模型,efd指向紅黑樹根節點 37 38 struct epoll_event tep, ep[OPEN_MAX]; //tep:epoll_ctl引數,ep[]:epoll_wait引數; 39 tep.events = EPOLLIN; 40 tep.data.fd = listenfd; //指定listenfd的監聽事件為“讀” 41 42 res = epoll_ctl(efd, EPOLL_CTL_ADD, listenfd, &tep); //將listenfd及對應的結構體設定到樹上,efd可找到該樹 43 44 for(;;){ 45 //epoll為server阻塞監聽事件,ep為struct epoll_event型別陣列,OPEN_MAX為陣列容量,-1表示永久阻塞 46 nready = epoll_wait(efd,ep,OPEN_MAX,-1); 47 48 for(i=0;i<nready;i++){ 49 if(!(ep[i].events & EPOLLIN)) 50 continue; 51 if(ep[i].data.fd == listenfd){ //判斷滿足事件的fd是不是lfd 52 clilen = sizeof(cliaddr); 53 connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&clilen); //接受連線 54 55 tep.events = EPOLLIN; 56 tep.data.fd = connfd; 57 58 res = epoll_ctl(efd,EPOLL_CTL_ADD,connfd,&tep); //加入紅黑樹 59 }else{ //不是lfd 60 sockfd = ep[i].data.fd; 61 n = read(sockfd,buf,MAXLINE); 62 63 if(n == 0){ //讀到0,說明客戶端關閉連線 64 res = epoll_ctl(efd, EPOLL_CTL_DEL, sockfd, NULL); //將該檔案描述符從紅黑樹摘除 65 close(sockfd); //關閉與該客戶端的連線 66 } 67 else if(n < 0){ //出錯 68 res = epoll_ctl(efd, EPOLL_CTL_DEL, sockfd, NULL); //摘除節點 69 close(sockfd); 70 } 71 else{ //讀到了位元組數 72 for(i=0;i<n;i++) 73 buf[i] = toupper(buf[i]); 74 75 write(STDOUT_FILENO,buf,n); 76 write(sockfd,buf,n); 77 } 78 } 79 } 80 } 81 close(listenfd); 82 return 0; 83 }
View Code Codeforces ID:Anonytt QQ: 847399102 可以新增&關注