linux epoll 簡單demo


一個簡單的epoll demo ,同時接受多個客戶端連接,並把接收到的字符串轉化為大寫字母返回給客戶端

 1 #include<stdio.h>
 2 #include<arpa/inet.h>
 3 #include<sys/epoll.h>
 4 #include<unistd.h>
 5 #include<ctype.h>
 6 #define MAXLEN 1024
 7 #define SERV_PORT 8000
 8 #define MAX_OPEN_FD 1024
 9 
10 int main(int argc,char *argv[]) 11 { 12     int listenfd,connfd,efd,ret; 13     char buf[MAXLEN]; 14     struct sockaddr_in cliaddr,servaddr; 15     socklen_t clilen = sizeof(cliaddr); 16     struct epoll_event tep,ep[MAX_OPEN_FD]; 17 
18     listenfd = socket(AF_INET,SOCK_STREAM,0); 19 
20     servaddr.sin_family = AF_INET; 21     servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 22     servaddr.sin_port = htons(SERV_PORT); 23     bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)); 24     listen(listenfd,20); 25     // 創建一個epoll fd
26     efd = epoll_create(MAX_OPEN_FD); 27     tep.events = EPOLLIN;tep.data.fd = listenfd; 28     // 把監聽socket 先添加到efd中
29     ret = epoll_ctl(efd,EPOLL_CTL_ADD,listenfd,&tep); 30     // 循環等待
31     for (;;) 32  { 33         // 返回已就緒的epoll_event,-1表示阻塞,沒有就緒的epoll_event,將一直等待
34         size_t nready = epoll_wait(efd,ep,MAX_OPEN_FD,-1); 35         for (int i = 0; i < nready; ++i) 36  { 37             // 如果是新的連接,需要把新的socket添加到efd中
38             if (ep[i].data.fd == listenfd ) 39  { 40                 connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen); 41                 tep.events = EPOLLIN; 42                 tep.data.fd = connfd; 43                 ret = epoll_ctl(efd,EPOLL_CTL_ADD,connfd,&tep); 44  } 45             // 否則,讀取數據
46             else
47  { 48                 connfd = ep[i].data.fd; 49                 int bytes = read(connfd,buf,MAXLEN); 50                 // 客戶端關閉連接
51                 if (bytes == 0){ 52                     ret =epoll_ctl(efd,EPOLL_CTL_DEL,connfd,NULL); 53  close(connfd); 54                     printf("client[%d] closed\n", i); 55  } 56                 else
57  { 58                     for (int j = 0; j < bytes; ++j) 59  { 60                         buf[j] = toupper(buf[j]); 61  } 62                     // 向客戶端發送數據
63  write(connfd,buf,bytes); 64  } 65  } 66  } 67  } 68     return 0; 69 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM