linux c++ epoll的简单实现

来源:互联网 发布:mmd成人动作数据 编辑:程序博客网 时间:2024/06/10 15:02
    #include <string.h>    #include <stdio.h>    #include <stdlib.h>    #include <unistd.h>    #include <sys/select.h>    #include <sys/time.h>    #include <sys/socket.h>    #include <netinet/in.h>    #include <arpa/inet.h>    #include <sys/epoll.h>    #include <errno.h>    #define OPEN_MAX 100000int main(){    struct epoll_event event;    struct epoll_event *wait_event;    int sockfd=socket(AF_INET,SOCK_STREAM,0);    struct sockaddr_in server_addr;    server_addr.sin_family=AF_INET;    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);    server_addr.sin_port=htons(8001);    bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr));    listen(sockfd,100);    int sockNumber[OPEN_MAX]={0};    sockNumber[0]=sockfd;    int crRet=epoll_create(10);    if(-1==crRet)    {        perror("创建文件描述符失败");        return 0;    }    event.data.fd=sockfd;    event.events=EPOLLIN;    int clRet=epoll_ctl(crRet,EPOLL_CTL_ADD,sockfd,&event);    if(-1==clRet)    {        perror("注册监听事件类型失败");    }    int max1=0;    char buf[1024]={0};    while(1)    {   wait_event=new epoll_event[max1+1];        clRet=epoll_wait(crRet,wait_event,max1+1,-1);        for(int i=0;i<clRet;i++)        {            if((sockfd==wait_event[i].data.fd)&&(EPOLLIN==wait_event[i].events&EPOLLIN))             {   struct sockaddr_in cli_addr;                  socklen_t length = sizeof(cli_addr);                  sockNumber[max1+1]=accept(sockfd,(struct sockaddr*)&cli_addr,&length);                  if(sockNumber[max1+1]>0)                  {                       event.data.fd = sockNumber[max1+1];                       event.events = EPOLLIN;                       int ret1 = epoll_ctl(crRet, EPOLL_CTL_ADD, sockNumber[max1+1], &event);                       max1++;                       if(-1==ret1)                       {                           perror("新连接的客户端注册失败");                       }                       printf("客户端%d上线\n",max1);                  }             }            else if(wait_event[i].data.fd>3&&( EPOLLIN == wait_event[i].events & (EPOLLIN|EPOLLERR)))              {      memset(buf,0,sizeof(buf));                     int len=recv(wait_event[i].data.fd,buf,sizeof(buf),0);                     if(len<=0)                      {                            for(int j=1;j<=max1;j++)                             {                                  if(wait_event[i].data.fd==sockNumber[j])                                    {                                            clRet=epoll_ctl(crRet,EPOLL_CTL_DEL,wait_event[i].data.fd,wait_event+i);                                            printf("客户端%d下线\n",max1);                                            sockNumber[j] =sockNumber[max1] ;                                            close(sockNumber[max1]);                                            sockNumber[max1] =-1;                                            max1--;                                            usleep(50000);                                    }                             }                      }                   else                     {                      printf("%s\n",buf);                     }           }        }        delete[] wait_event;    }    return 0;}

0 0