EPOLL

最近android项目 NDK用到的EPOLL

#define MAX_SIZE 4096
#define BYTE unsigned char
int 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{
                    //处理接收的数据
                    /*
                    ...
                    */
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值