您的位置:首页 > 其它

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

2014-12-05 10:43 766 查看
本段代码不保证可编译,甚至不保证正确性,仅仅给出使用的简单示例,懒人各取所需:

#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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: