初学libevent笔记

初学libevent笔记

参考:http://www.cnblogs.com/luxiaoxun/p/3704573.html 在此表示严重感谢!!
初学libevent,自己做个笔记。

代码块

http server:

#include <event.h>
#include <evhttp.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string>
#include <stdlib.h>

using namespace std;
int httpserver_bindsocket(int port, int backlog);
int httpserver_start(int port, int nthreads, int backlog);
void* httpserver_Dispatch(void *arg);
void httpserver_GenericHandler(struct evhttp_request *req, void *arg);
int httpserver_ProcessRequest(struct evhttp_request *req);

int httpserver_bindsocket(int port, int backlog) 
{
        int r;
        int nfd;
        nfd = socket(AF_INET, SOCK_STREAM, 0);
        if (nfd < 0) return -1;
        int one = 1;
        r = setsockopt(nfd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(int));
        struct sockaddr_in addr;
        memset(&addr, 0, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_port = htons(port);
        r = bind(nfd, (struct sockaddr*)&addr, sizeof(addr));
        if (r < 0) return -1;
        r = listen(nfd, backlog);
        if (r < 0) return -1;
        int flags;
        if ((flags = fcntl(nfd, F_GETFL, 0)) < 0 || fcntl(nfd, F_SETFL, flags | O_NONBLOCK) < 0)
                return -1;
        return nfd;
}

int httpserver_start(int port, int nthreads, int backlog) 
{
        int r, i;
        int nfd = httpserver_bindsocket(port, backlog);
        if (nfd < 0) return -1;
        pthread_t ths[nthreads];
        for (i = 0; i < nthreads; i++) 
        {
                //printf("Thread %d created.\n",i);
                struct event_base *base = event_init();
                if (base == NULL) return -1;
                struct evhttp *httpd = evhttp_new(base);
                if (httpd == NULL) return -1;
                r = evhttp_accept_socket(httpd, nfd);
                if (r != 0) return -1;
                evhttp_set_gencb(httpd, httpserver_GenericHandler, NULL);
                r = pthread_create(&ths[i], NULL, httpserver_Dispatch, base);
                //printf("r = %d\n",r);
                if (r != 0) return -1;
        }
        for (i = 0; i < nthreads; i++)
        {
                pthread_join(ths[i], NULL);
        }
}

void* httpserver_Dispatch(void *arg) 
{
        event_base_dispatch((struct event_base*)arg);
        return NULL;
}

void httpserver_GenericHandler(struct evhttp_request *req, void *arg) {
              httpserver_ProcessRequest(req);
}

int httpserver_ProcessRequest(struct evhttp_request *req) {
    printf("A client come:\n");
    struct evbuffer *buf = evbuffer_new();
    if (buf == NULL) return 1;

    const char * al = evhttp_uri_get_query(req->uri_elems);
    //printf("get mythod req: %s\n",al);

    int length = EVBUFFER_LENGTH(req->input_buffer);
    //printf("post data length = %d\n",length);
    char * post_data = (char*)malloc(length + 1);
    memset(post_data,'\0',length + 1);
    memcpy(post_data,EVBUFFER_DATA(req->input_buffer),length);

    //printf("post data is :%s\n",post_data);
    char * retmsg = "";
    struct evkeyvalq h;
    if(!al)
    {
            printf("URI ERROR. Usage:http://ip:port/xx?xx=yy&sentence=yy\n\n");
            evbuffer_free(buf);
            free(post_data);
            return 1;
    }
    else
    {

        if(strcmp(post_data,"") == 0)
        {
                printf("Http GET\n");
                if(evhttp_parse_query_str(al,&h))
                {
                        printf("Get data error\n");
                        evbuffer_free(buf);
                        free(post_data);
                        evhttp_clear_headers(&h);
                        return 1;
                }
        }
        else
        {
                printf("Http POST\n");
                int ret = evhttp_parse_query_str(post_data,&h);
                if(ret)
                {
                        printf("Post data error\n");
                        evbuffer_free(buf);
                        free(post_data);
                        evhttp_clear_headers(&h);
                        return 1;
                }
        }


        printf("h = %s ,",h.tqh_first->key);
        printf("value = %s. ",h.tqh_first->value);
        const char * query = evhttp_find_header(&h,"sentence");
        if(!query)
        {
                printf("Can't find the sentence in the URI\n\n");
                //evbuffer_free(buf);
                //free(post_data);
                //evhttp_clear_headers(&h);

                //return 1;
                evbuffer_add_printf(buf, "Can't find the sentence in the URI", al);
        }
        else
        {
            char * sent = evhttp_decode_uri(query);
            printf("sentence = %s\n\n",sent);
            //printf("h = %s\n",(*(h.tqh_last))->key);
            //printf("h = %s\n",(*(h.tqh_last))->value);
            //string s1 = getHanleName(al);
            //printf("s1 = %s\n",s1);
            //const char * ptype = evhttp_find_header(&h,"type");
            //if(ptype)
                    //printf("ptype = %s\n",ptype);
            evbuffer_add_printf(buf, "%s", sent);
        }
    }
    evhttp_add_header(req->output_headers,"Content-Type","text/html;charset=UTF-8");
    evhttp_send_reply(req, HTTP_OK, "OK", buf);
    evbuffer_free(buf);
    free(post_data);
    evhttp_clear_headers(&h);
}

int main(int argc,char **argv)
{
        if(argc != 2)
        {
                printf("Usage: ./serv port\n");
                return 1;
        }
        int port = atoi(argv[1]);
        httpserver_start(port, 10, 10240);
}

client(或者用浏览器打开ip也可以):

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import json,urllib2,urllib
import sys
url="http://127.0.0.1:8080/cm?"
#request = urllib2.Request(url)
data={}
data['type']='test'
data['sentence']='hhh'
params=urllib.urlencode(data)
res = urllib2.urlopen(url,params)
str = res.read().strip()
print str
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值