EPOLL CODE Ex1(from:七猫)

#pragma once
#include <errno.h>
#include <sys/epoll.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include "log.h"

#ifndef EPOLL_SIZE
#define EPOLL_SIZE 4096
#define EPOLL_CONTEXT_SIZE (4096+256)
#endif

typedef void * EPollerContext;
class Epoller
{
public:
    Epoller(){}
    virtual ~Epoller(){}
    bool create()
    {
        memset(_contexts,0,sizeof(_contexts));
        _handle=epoll_create(EPOLL_SIZE);
        if(_handle==-1)
        {
            glog.log(__FUNCTION__,"Epoll create error,errno is %d",errno);
            return false;
        }
        else
            return true;
    }
    void handle_events()
    {
        for(int i=0;i<_lastntfd;i++)
        {
            on_event(_events[i].data.fd,_events[i].events);
        }
    }
    int get_online_users()
    {
        int result=0;
        for(int i=0;i<EPOLL_CONTEXT_SIZE;i++)
        {
            if(_contexts[i]!=0)
                result++;
        }
        return result;
    }
public:
    bool add(int fd,unsigned int events)
    {
        epoll_event polevt;
        polevt.events=events;
        polevt.data.fd=fd;
        return ctl(EPOLL_CTL_ADD,fd,polevt)==0;
    }
    bool del(int fd,unsigned int events)
    {
        epoll_event polevt;
        polevt.events=events;
        polevt.data.fd=fd;
        return ctl(EPOLL_CTL_DEL,fd,polevt)==0;
    }
    bool modify(int fd,unsigned int events)
    {
        epoll_event polevt;
        polevt.events=events;
        polevt.data.fd=fd;
        return ctl(EPOLL_CTL_MOD,fd,polevt)==0;
    }
    int poll(int timeout=5000)
    {
        _lastntfd=epoll_wait(_handle,_events,EPOLL_SIZE,timeout);
        return _lastntfd;
    }
protected:
    int ctl(int op, int fd, struct epoll_event &event)
    {
        int ret=epoll_ctl(_handle,op,fd,&event);
        if(ret!=0)
        {
            glog.log(__FUNCTION__,"epoll_ctl fail,op is %d,fd is %d,errno is %d",op,fd,errno);
        }
        return ret;
    }
protected:
    static bool setnonblocking(int sock)
    {
        int opts;
        opts=fcntl(sock,F_GETFL);
        if(opts<0)
            opts=O_NONBLOCK;
        else
            opts = opts|O_NONBLOCK;
        if(fcntl(sock,F_SETFL,opts)<0)
        {
            glog.log(__FUNCTION__,"setnoblock error");
            return false;
        }
        else
            return true;
    }

    static bool setreuseport(int sock)
    {
        int on=1;
        int ret=setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(int));
        return ret!=-1;
    }



protected:
    virtual void on_event(int fd,int events){}
private:
    int _handle;
    epoll_event _events[EPOLL_SIZE];
    int _lastntfd;
protected:
    EPollerContext _contexts[EPOLL_CONTEXT_SIZE];
    EPollerContext get_context(int value)
    {
        return _contexts[value];
    }
    bool set_context(int value,EPollerContext context)
    {
        _contexts[value]=context;
    }
};







class ExampleServer : public Epoller
{
public:
    bool init();
    void fini();
    void check_timeout();
protected:
    void on_event(int fd,int events);
private:
    void add_newsock(int sockvalue);
    void remove_sock(int sockvalue);
private:
    int _listen_handler;
};




#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include "server.h"
#include "clientmanager.h"

bool ExampleServer::init()
{
    this->create();
    _listen_handler=socket(AF_INET,SOCK_STREAM,0);
    setnonblocking(_listen_handler);
    setreuseport(_listen_handler);
    sockaddr_in serveraddr;
    memset(&serveraddr,0,sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
    serveraddr.sin_port=htons(ITEMLIST_SERVER_PORT);
    bind(_listen_handler,(sockaddr *)&serveraddr, sizeof(serveraddr));
    listen(_listen_handler,ITEMCOMMENT_SERVER_LISTEN_BACKLOG);
    this->add(_listen_handler,EPOLLIN|EPOLLOUT);
    this->set_context(_listen_handler,0);
}

void ExampleServer::fini()
{
    close(_listen_handler);
}

void ExampleServer::add_newsock(int sockvalue)
{
    if(sockvalue>EPOLL_CONTEXT_SIZE)
    {
        glog.log(__FUNCTION__,"newsock is %d,> %d",sockvalue,EPOLL_CONTEXT_SIZE);
        close(sockvalue);
        return;
    }

    ClientSession *newsession=gClientManager.alloc_client_session(sockvalue);
    if(newsession==NULL)
    {
        close(sockvalue);
        return;
    }
    if(add(sockvalue,EPOLLIN|EPOLLOUT))
    {
        this->set_context(sockvalue,newsession);
    }
    else
    {
        gClientManager.release_client(newsession);
        close(sockvalue);    
    }
}

void ExampleServer::remove_sock(int sockvalue)
{
    this->del(sockvalue,0);
    close(sockvalue);
    ClientSession *client=(ClientSession *)this->get_context(sockvalue);
    if(client)
    {
        gClientManager.release_client(client);
    }
    this->set_context(sockvalue,0);
}

void ExampleServer::on_event(int fd,int events)
{
    if(fd==_listen_handler)
    {
        sockaddr_in sa;
        memset(&sa,0,sizeof(sa));
        socklen_t salen=sizeof(sa);
        int newsock=accept(_listen_handler,(sockaddr *)&sa,&salen);
        if(newsock>0)
        {
            add_newsock(newsock);
        }
    }
    else
    {
        ClientSession *client=(ClientSession *)this->get_context(fd);
        if(client!=NULL)
        {
            int newevents=client->handle_events(fd,events);
            if(newevents==0)
            {
                remove_sock(fd);
            }
            else
                this->modify(fd,newevents);
        }
    }
}


void ExampleServer::check_timeout()
{
    unsigned int curtime=time(NULL);
    for(int i=0;i<EPOLL_SIZE+256;i++)
    {
        ClientSession *client=(ClientSession *)this->get_context(i);
        if(client!=NULL)
        {
            if(curtime-client->get_last_io_time()>ITEMINDEX_SERVER_MAX_TIMEOUT)
            {
                remove_sock(i);
            }
        }
    }
}

内容概要:本文深入探讨了多种高级格兰杰因果检验方法,包括非线性格兰杰因果检验、分位数格兰杰因果检验、混频格兰杰因果检验以及频域因果检验。每种方法都有其独特之处,适用于不同类型的时间序列数据。非线性格兰杰因果检验分为非参数方法、双变量和多元检验,能够在不假设数据分布的情况下处理复杂的关系。分位数格兰杰因果检验则关注不同分位数下的因果关系,尤其适合经济数据的研究。混频格兰杰因果检验解决了不同频率数据之间的因果关系分析问题,而频域因果检验则专注于不同频率成分下的因果关系。文中还提供了具体的Python和R代码示例,帮助读者理解和应用这些方法。 适合人群:从事时间序列分析、经济学、金融学等领域研究的专业人士,尤其是对非线性因果关系感兴趣的学者和技术人员。 使用场景及目标:①研究复杂非线性时间序列数据中的因果关系;②分析不同分位数下的经济变量因果关系;③处理不同频率数据的因果关系;④识别特定频率成分下的因果关系。通过这些方法,研究人员可以获得更全面、细致的因果关系洞察。 阅读建议:由于涉及较多数学公式和编程代码,建议读者具备一定的统计学和编程基础,特别是对时间序列分析有一定了解。同时,建议结合具体案例进行实践操作,以便更好地掌握这些方法的实际应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值