Libevent基本应用实例--专为懒人定制

本段代码不保证可编译,甚至不保证正确性,仅仅给出使用的简单示例,懒人各取所需:

#define MAX_ARG_LENGTH 1024
/**
 *  Http server callback 
 */
void http_handle(struct evhttp_request *request,void *data){
    if( EVHTTP_REQ_GET == request->type){
        (char*)data = strdup(request->uri);
    }
    if( EVHTTP_REQ_POST == request->type){
        size_t size = EVBUFFER_LENGTH(request->input_buffer);
        if(size > 0){
            memcpy((char*)data, EVBUFFER_DATA(request->input_buffer),size);
        }
    }
    struct evkeyvalq *param;
    evhttp_parse_query(uri, param);
    const char *user = evhttp_find_header(param, "user");
    const char *information = evhttp_find_header(param, "information");
    
    // do something with the information like parse to JSON and so on.
    
    struct evbuffer *response = evbuffer_new();
    evhttp_add_header(req->output_headers, "Content-Type", "text/plain");
    evhttp_add_header(req->output_headers, "Connection", "keep-alive");
    evhttp_add_header(req->output_headers, "Cache-Control", "no-cache"); 
    evhttp_add_header(req->output_headers, "author", "zhousy");

    evbuffer_add_printf(response,"information=%s",information);

    evhttp_send_reply(req, HTTP_OK, "OK", response);
    // evhttp_send_reply(req, HTTP_BADREQUEST, "BAD request", response);
    
    evhttp_clear_headers(param);
    evbuffer_free(response);


}
/**
 * Http client callback
 */
void client_handler(struct evhttp_request request, void *data){
     //const char *content_length = evhttp_find_header(request->input_headers, "Content-Length");
     size_t size = EVBUFFER_LENGTH(request->input_buffer);
     if(size > 0){
        const char *content =  EVBUFFER_DATA(request->input_buffer);
     }
     evhttp_connection_free((evhttp_connection*)data);

}

int main(int argc, char* argv[]){
    
    struct event_base *base;
    struct evhttp *http;

    struct event *timer_event;
    struct event *IO_event;
    struct event *SIG_event;

    char *ip = argv[1];
    int port = atoi(argv[2]);
    char *data[MAX_ARG_LENGTH];

    base = event_base_new();
    http = evhttp_new(base);
    if( -1 == evhttp_bind_socket(http, ip , port)){
        exit(1);
    }
    else{
        evhttp_set_gencb(http, http_handle, (void*)data);
    }
    evhttp_set_timeout(http,120);

    /**
     * This is the sample show how to add timer event using Libevent
     */
    struct timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 10;
    evtimer_set(timer_event, timer_event_handler, (void*)data);
    event_base_set(base, timer_event);
    evtimer_add(timer_event, &timeout);

    /**
     * This is the sample show how to add IO event using Libevent
     */
    //int file = open(argv[3],O_RDWR | O_CREATE | O_TRUNC, S_IRWXU|S_IWGRP|S_IROTH);
    //fcntl(file,F_SETFL,O_NONBLOCK);
    int socket = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = hton(inet_aton("127.0.0.1"));
    addr.sin_port = htons(80);
    if(connect( socket,(sockaddr*) &addr, sizeof(addr)) < 0){
        exit(1);
    }
    event_set(IO_event, socket, EV_READ | EV_PERSIST, IO_event_handler, (void*)data);
    event_base_set(base,IO_event);
    event_add(IO_event,NULL);

    /**
     * This is the sample show how to add signal event using Libevent
     */
    //SIG_event = evsignal_new(base, SIGUSR1, SIG_event_handler,NULL);
    //evsignal_add(SIG_event,NULL);
    //signal_set(SIG_event, SIGCHLD, SIG_event_handler, (void*)data);
    evsignal_set(SIG_event, SIGCHLD, SIG_event_handler, (void*)data);
    event_base_set(base,SIG_event);
    while(true){
        struct timeval run_interval_time;
        run_interval_time.tv_sec = 0;
        run_interval_time.tv_usec = 1000;
        event_base_loopexit(base,&run_interval_time);
        event_base_dispatch(base);
        // do something else when exit from dispatch;
    }
   

    /**
     *  This is the sample show how to build client request using Libevent
     * 
     */
    struct evhttp_connection *client;
    struct evhttp_request *request;
    client = evhttp_connection_new("127.0.0.1",80);
    if(client){
        evhttp_connection_set_base(base,client);
        //set connection timeout
        evhttp_connection_set_timeout(client, 5);
        //set response handler      
        request =  evhttp_request_new(client_handler, (void*)client);
        //set request headers
        evhttp_add_header(request->output_headers, "Host", "127.0.0.1");
        evhttp_add_header(request->output_headers, "Content-Length", "0");
        //set request type and send request
        evhttp_make_request(client, request,EVHTTP_REQ_GET, request_str->str);
    }



    evtimer_del(timer_event);
    signal_del(SIG_event);

    evhttp_free(http);
    event_base_free(base);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值