epoll一个简单的例子:



C/C++ codeint 

main()

{
    //声明epoll_event结构体的变量,ev用于注册事件,数组用于回传要处理的事件
    struct epoll_event ev,events[20];

    epfd=epoll_create(10000); //创建epoll句柄
   
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    //把socket设置为非阻塞方式
    setnonblocking(listenfd);
   
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = INADDR_ANY;
    serveraddr.sin_port=htons(SERV_PORT);
    bind(listenfd,(struct sockaddr )&serveraddr, sizeof(serveraddr));
    listen(listenfd, 255);

    //设置与要处理的事件相关的文件描述符
    ev.data.fd=listenfd;
    //设置要处理的事件类型
    ev.events=EPOLLIN;
    //注册epoll事件
    epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);

    for ( ; ; )
    {
      //等待epoll事件的发生
      nfds=epoll_wait(epfd,events,20,1000);
      //处理所发生的所有事件
      for(i=0;i<nfds;++i)
      {
         if(events
  .data.fd==listenfd)
         {
                connfd = accept(listenfd,(struct sockaddr )&clientaddr, &clilen);
                if(connfd<0)
                {
                  perror("connfd<0");
                }
                setnonblocking(connfd);
                //设置用于读操作的文件描述符
                ev.data.fd=connfd;
                //设置用于注测的读操作事件
                ev.events=EPOLLIN|EPOLLET;
                //注册event
                epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);
         }
         else if(events
  .events&EPOLLIN)
         {
                read_socket(events
  .data.fd);
                ev.data.fd=events
  .data.fd;
                ev.events=EPOLLIN|EPOLLOUT|EPOLLET;
                epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
         }
         else if(events
  .events&EPOLLOUT)
         {
                write_socket(events
  .data.fd);
                ev.data.fd=events
  .data.fd;
                ev.events=EPOLLIN|EPOLLET; //ET模式
            epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
         }
         else
         {
                perror("other event");
         }
      }
    }

}

转载于:https://my.oschina.net/cmffire/blog/145522

好的,这里是一个简单epoll 例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/epoll.h> #define MAX_EVENTS 10 int main(int argc, char *argv[]) { int listen_sock, conn_sock, epoll_fd, nfds, i, n; struct sockaddr_in serv_addr, cli_addr; socklen_t cli_len = sizeof(cli_addr); struct epoll_event ev, events[MAX_EVENTS]; char buffer[1024]; if ((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(EXIT_FAILURE); } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(8080); if (bind(listen_sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("bind"); exit(EXIT_FAILURE); } if (listen(listen_sock, SOMAXCONN) < 0) { perror("listen"); exit(EXIT_FAILURE); } if ((epoll_fd = epoll_create1(0)) < 0) { perror("epoll_create1"); exit(EXIT_FAILURE); } ev.events = EPOLLIN; ev.data.fd = listen_sock; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listen_sock, &ev) < 0) { perror("epoll_ctl: listen_sock"); exit(EXIT_FAILURE); } while (1) { nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); if (nfds < 0) { perror("epoll_wait"); exit(EXIT_FAILURE); } for (i = 0; i < nfds; ++i) { if (events[i].data.fd == listen_sock) { conn_sock = accept(listen_sock, (struct sockaddr *) &cli_addr, &cli_len); if (conn_sock < 0) { perror("accept"); exit(EXIT_FAILURE); } ev.events = EPOLLIN; ev.data.fd = conn_sock; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, conn_sock, &ev) < 0) { perror("epoll_ctl: conn_sock"); exit(EXIT_FAILURE); } } else { n = read(events[i].data.fd, buffer, sizeof(buffer)); if (n < 0) { perror("read"); exit(EXIT_FAILURE); } if (n == 0) { if (epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, NULL) < 0) { perror("epoll_ctl: conn_sock"); exit(EXIT_FAILURE); } close(events[i].data.fd); } else { if (write(events[i].data.fd, buffer, n) < 0) { perror("write"); exit(EXIT_FAILURE); } } } } } return 0; } ``` 这个程序监听端口 8080,并使用 epoll 实现了一个简单的回显服务器。它可以同时处理多个连接,当有新连接到来时,将其加入 epoll 监听队列中,当某个连接的数据可读时,就读取并回显给客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值