收集的未经测试的Epoll模型代码[二]

  1. /*------------------------------------------------------------------------------------------------- 
  2. gcc -o epolld epoll.c -lpthread 
  3. author: wyezl 
  4. 2006.4.28 
  5. ---------------------------------------------------------------------------------------------------*/  
  6.   
  7. #include <sys/socket.h>  
  8. #include <sys/epoll.h>  
  9. #include <netinet/in.h>  
  10. #include <arpa/inet.h>  
  11. #include <fcntl.h>  
  12. #include <unistd.h>  
  13. #include <stdio.h>  
  14. #include <pthread.h>  
  15. #include <errno.h>  
  16. #include <string.h>  
  17.   
  18.   
  19. #define PORT 8888  
  20. #define MAXFDS 5000  
  21. #define EVENTSIZE 100  
  22.   
  23. #define BUFFER "HTTP/1.1 200 OK\r\nContent-Length: 5\r\nConnection: close\r\nContent-Type: text/html\r\n\r\nHello"  
  24.   
  25. int epfd;  
  26. void *serv_epoll(void *p);  
  27. void setnonblocking(int fd)  
  28. {  
  29.     int opts;  
  30.     opts=fcntl(fd, F_GETFL);  
  31.     if (opts < 0)  
  32.     {  
  33.           fprintf(stderr, "fcntl failed\n");  
  34.           return;  
  35.     }  
  36.     opts = opts | O_NONBLOCK;  
  37.     if(fcntl(fd, F_SETFL, opts) < 0)  
  38.     {  
  39.           fprintf(stderr, "fcntl failed\n");  
  40.           return;  
  41.     }  
  42.     return;  
  43. }  
  44.   
  45. int main(int argc, char *argv[])  
  46. {  
  47.     int fd, cfd,opt=1;  
  48.     struct epoll_event ev;  
  49.     struct sockaddr_in sin, cin;  
  50.     socklen_t sin_len = sizeof(struct sockaddr_in);  
  51.     pthread_t tid;  
  52.     pthread_attr_t attr;  
  53.   
  54.     epfd = epoll_create(MAXFDS);  
  55.     if ((fd = socket(AF_INET, SOCK_STREAM, 0)) <= 0)  
  56.     {  
  57.           fprintf(stderr, "socket failed\n");  
  58.           return -1;  
  59.     }  
  60.     setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void*)&opt, sizeof(opt));  
  61.   
  62.     memset(&sin, 0, sizeof(struct sockaddr_in));  
  63.     sin.sin_family = AF_INET;  
  64.     sin.sin_port = htons((short)(PORT));  
  65.     sin.sin_addr.s_addr = INADDR_ANY;  
  66.     if (bind(fd, (struct sockaddr *)&sin, sizeof(sin)) != 0)  
  67.     {  
  68.           fprintf(stderr, "bind failed\n");  
  69.           return -1;  
  70.     }  
  71.     if (listen(fd, 32) != 0)  
  72.     {  
  73.           fprintf(stderr, "listen failed\n");  
  74.           return -1;  
  75.     }  
  76.   
  77.     pthread_attr_init(&attr);  
  78.     pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);  
  79.     if (pthread_create(&tid, &attr, serv_epoll, NULL) != 0)  
  80.     {  
  81.           fprintf(stderr, "pthread_create failed\n");  
  82.           return -1;  
  83.     }  
  84.   
  85.     while (1)  
  86.     {  
  87.                 cfd = accept(fd, (struct sockaddr *)&cin, &sin_len);  
  88.                 if(cfd <= 0)  
  89.                 {  
  90.                         sleep(1);  
  91.                         continue;  
  92.                 }  
  93.           setnonblocking(cfd);  
  94.           ev.data.fd = cfd;  
  95.           ev.events = EPOLLIN | EPOLLET;  
  96.           if(epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &ev) < 0)  
  97.            {  
  98.                         close(cfd);  
  99.                         }  
  100.           //printf("connect from %s\n",inet_ntoa(cin.sin_addr));  
  101.   
  102.           //printf("cfd=%d\n",cfd);  
  103.   
  104.     }  
  105.   
  106.     if (fd > 0)  
  107.           close(fd);  
  108.     return 0;  
  109. }  
  110.   
  111. void *serv_epoll(void *p)  
  112. {  
  113.     int i, ret, cfd, nfds;;  
  114.     struct epoll_event ev,events[EVENTSIZE];  
  115.     char buffer[512];  
  116.   
  117.     while (1)  
  118.     {  
  119.           nfds = epoll_wait(epfd, events, EVENTSIZE , -1);  
  120.           //printf("nfds ........... %d\n",nfds);  
  121.   
  122.           for (i=0; i<nfds; i++)  
  123.           {  
  124.                 if(events[i].events & EPOLLIN)  
  125.                 {  
  126.                     cfd = events[i].data.fd;  
  127.                     ret = recv(cfd, buffer, sizeof(buffer),0);  
  128.                     //printf("read ret..........= %d\n",ret);  
  129.   
  130.   
  131.                     ev.data.fd = cfd;  
  132.                     ev.events = EPOLLOUT | EPOLLET;  
  133.                     epoll_ctl(epfd, EPOLL_CTL_MOD, cfd, &ev);  
  134.                 }  
  135.                 else if(events[i].events & EPOLLOUT)  
  136.                 {  
  137.                     cfd = events[i].data.fd;  
  138.                     ret = send(cfd, buffer, strlen(buffer), 0);  
  139.                     //printf("send ret...........= %d\n", ret);  
  140.   
  141.   
  142.                     ev.data.fd = cfd;  
  143.                     epoll_ctl(epfd, EPOLL_CTL_DEL, cfd, &ev);  
  144.                     //shutdown(cfd, 1);  
  145.                                         if(cfd > 0)  
  146.                     close(cfd);  
  147.   
  148.                 }  
  149.           }  
  150.     }  
  151.     return NULL;  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值