Libevent基本应用实例--专为懒人定制
来源:互联网 发布:迪杰斯特拉算法应用 编辑:程序博客网 时间:2024/06/11 04:27
本段代码不保证可编译,甚至不保证正确性,仅仅给出使用的简单示例,懒人各取所需:
#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);}
0 0
- Libevent基本应用实例--专为懒人定制
- libevent应用
- 加载百度地图,设置中心点,专为懒人准备
- Sql 基本语句 -- 懒人代码
- ios懒人笔记应用源码
- 懒人库ButterKnife的应用
- Libevent基本流程
- libevent中的基本数据结构
- Libevent 基本介绍
- libevent多线程编程实例
- libevent框架使用实例
- libevent通信库实例
- 为你的Android应用定制属于你的BaseActivity
- 为你的Android应用定制属于你的BaseActivity
- libevent的简单应用
- LIBEVENT应用举例1
- LIBEVENT应用举例2
- libevent简单应用_2
- CSS3 经典教程系列:CSS3 线性渐变(linear-gradient)
- caffe的数据集的data和label制作原则
- tinyxml使用
- Win7 + vs2012 + cocos2d-x2.2.5 配置开发环境
- java 线程wait()与notify()的用法(被唤醒后的线程到底重新执行同步代码块还是从那是等待的那里继续执行)
- Libevent基本应用实例--专为懒人定制
- 【d3.js实践教程01】d3基本操作
- Linux SSH
- python 过滤中文、英文标点特殊符号
- PMP 读书笔记纲要1
- Linux之Makefile(静态模式)
- MapReduce原理与设计思想
- Spring学习笔记——基础知识
- C/C++ 中的assert()宏 断言机制 (转)