EPOLL

来源:互联网 发布:linux黑客帝国代码雨 编辑:程序博客网 时间:2024/06/15 08:35

最近android项目 NDK用到的EPOLL

#define MAX_SIZE 4096#define BYTE unsigned charint epfd;int set_non_blocking(int socket_fd){    if (fcntl(socket_fd, F_SETFL, fcntl(socket_fd, F_GETFL)|O_NONBLOCK) == -1)    {        return -1;    }    return 0;}void startServer(int port,int Max_Buff_Size){    int server_id = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);    if(server_id < 0)    {        return;    }    int reuse = 1;    if(setsockopt(server_id,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)    {        return;    }    int size = Max_Buff_Size;    if(setsockopt(server_id,SOL_SOCKET,SO_RCVBUF,&size, sizeof(size)) < 0)    {        return;    }    set_non_blocking(server_id);    struct sockaddr_in addr_in;    memset(&addr_in,0,sizeof(sockaddr_in));    addr_in.sin_family = AF_INET;    addr_in.sin_addr.s_addr = htons(INADDR_ANY);    addr_in.sin_port = htons(port);    if(bind(server_id,(const struct sockaddr*)&addr_in,sizeof(sockaddr_in)) < 0)    {        return;    }    if(listen(server_id,65535) < 0)    {        return;    }    epoll_event ev;    epoll_event events[MAX_SIZE];    epfd = epoll_create(MAX_SIZE);    ev.events = EPOLLIN;    ev.data.fd = server_id;    if(epoll_ctl(epfd,EPOLL_CTL_ADD,server_id,&ev) < 0)    {        return;    }    BYTE buf[Max_Buff_Size];    while(true)    {        int nfds = epoll_wait(epfd,events,MAX_SIZE,-1);        if(nfds < 0 && errno != EINTR)        {            break;        }        for(int n = 0;n < nfds;++n)        {            if(events[n].data.fd == server_id)            {                struct sockaddr_in remote_in;                socklen_t len_t = sizeof(remote_in);                int client_socket = accept(server_id,(sockaddr*)&remote_in,&len_t);                if(client_socket < 0)                {                    continue;                }                set_non_blocking(client_socket);                ev.events = EPOLLIN;                ev.data.fd = client_socket;                epoll_ctl(epfd,EPOLL_CTL_ADD,client_socket,&ev);            }            else if(events[n].events & EPOLLIN)            {                int client_socket = events[n].data.fd;                if(client_socket < 0){ continue; }                memset(&buf,0,sizeof(buf));                ssize_t ret = recv(client_socket,buf,sizeof(buf),0);                if(ret <= 0)                {                    close(client_socket);                    ev = events[n];                    epoll_ctl(epfd, EPOLL_CTL_DEL, client_socket, &ev);                    continue;                }else{                    //处理接收的数据                    /*                    ...                    */                }            }        }    }}