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 }

 

posted @ 2016-05-08 15:48  你好阿汤哥  Views(4262)  Comments(0Edit  收藏  举报