初学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