`
tcspecial
  • 浏览: 911425 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

libevent 的使用

阅读更多

      libevent 封装了低层最高效的网络模型,windows的compIO,linux下的epoll模型,freebsd的kqueue,提供统一的异步调用接口; 以事件方式驱动,chrome,memcached 都在使用该框架.

      libevent 同时也支持DNS,HTTP协议和RPC调用框架

 

一. 定时器

#include <stdio.h>
#include <event.h>

void onTime(int sock,short event,void *arg)
{
	printf("Game over!\n");

	struct timeval tv;
	tv.tv_sec = 1;
	tv.tv_usec = 0;

	// 事件执行后,默认就被删除,需要重新add,使之重复执行
	event_add((struct event*)arg,&tv);
}

int main()
{
	// 初始化事件
	event_init();

	// 设置定时器回调函数
	struct event evTime;
	evtimer_set(&evTime,onTime,&evTime);

	struct timeval tv;  // 1s后执行
	tv.tv_sec = 1;
	tv.tv_usec = 0;
	
        // 添加事件
	event_add(&evTime,&tv);
	// 循环派发事件
	event_dispatch();

	return 0;
}

    编译: gcc -o  time_test time_test.c -I/usr/local/libevent/include -L/usr/local/libevent/lib -levent

 

二. TCP服务器

    

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <event.h>


struct event_base *base;

// 读事件
void onRead(int clifd,short ievent,void *arg)
{
	int ilen;
	char buf[1500];

	ilen = recv(clifd,buf,1500,0);

	if(ilen <= 0)
	{
		printf("Client close\n");
		
		struct event *pread = (struct event*)arg;
		event_del(pread);
		delete pread;

		close(clifd);
		return;
	}
	
	buf[ilen] = '\0';
	printf("Accpet: %s\n",buf);
}

// 连接事件
void onAccept(int svrfd,short ievent,void *arg)
{
	int clifd;
	struct sockaddr_in cliaddr;

	socklen_t sinsize = sizeof(cliaddr);
	clifd = accept(svrfd,(struct sockaddr*)&cliaddr,&sinsize);

	struct event *pread = new event;
	event_set(pread,clifd,EV_READ|EV_PERSIST,onRead,pread);  // 注册读(写)事件
	event_base_set(base,pread);
	event_add(pread,NULL);
}


int main()
{
	int svrfd;
	struct sockaddr_in svraddr;

	memset(&svrfd,0,sizeof(svraddr));
	svraddr.sin_family = AF_INET;
	svraddr.sin_port = htons(1234);
	svraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	svrfd = socket(AF_INET,SOCK_STREAM,0);
	bind(svrfd,(struct sockaddr*)&svraddr,sizeof(svraddr));

	listen(svrfd,10);

	// 初始化事件库
	base = event_base_new();

	// 初始化一个连接事件,EV_PRESIST指定重复执行该事件
	struct event evlisten;
	event_set(&evlisten,svrfd,EV_READ|EV_PERSIST,onAccept,NULL);

	// 设置为base事件
	event_base_set(base,&evlisten);
	// 添加事件
	event_add(&evlisten,NULL);
	// 事件循环
	event_base_dispatch(base);

	return 0;

}

    要实现windows下更高效的IOCP方式的API,IOCP在准备好读写事件时不会通知你的程序去拷贝数据,而时在数据完成从内核态拷贝到用户态时才通知应用程序. libevent 2提供了 bufferevent 接口,支持这种编程范式 

 

三. HTTP服务器

   

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <event.h>
#include <evhttp.h>

void reqHandler(struct evhttp_request *req,void *arg)
{
	struct evbuffer *buf = evbuffer_new();
	
	// 发送响应
	evbuffer_add_printf(buf, "Thanks for the request");
	evhttp_send_reply(req,HTTP_OK,"Client",buf);
	
	evbuffer_free(buf);
	
	return;
}

int main(int argc,char **argv)
{
	short port = 8000;
	const char *addr = "192.168.1.11";
	struct evhttp *httpserv = NULL;

	event_init();
        // 启动http服务
	httpserv = evhttp_start(addr,port);

	// 设置回调
	evhttp_set_gencb(httpserv, reqHandler,NULL);
	printf("Server started on port %d\n",port);

	event_dispatch();

	return 0;
}

    浏览器访问: http://192.168.1.11:8000 会显示 Thanks for the request

 

    原文参见: http://blog.csdn.net/yyyiran/article/details/12219737

 

 

分享到:
评论

相关推荐

    libevent-2.0.22 windows和linux下的静态库,附源码和libevent使用手册

    libevent-2.0.22-stable.tar.gz源码编译的Windows和Linux下的静态库,另附源码,电子书《libevent参考手册(中文版).pdf》、《libevent源码深度剖析.pdf》、《LibeventBook.pdf》。 Linux环境下该libevent静态库修改...

    cocos2dx libevent 使用

    本文将详细介绍如何在Cocos2d-x项目中集成和使用libevent。 首先,我们需要了解libevent的基本概念。libevent是一个轻量级的库,它的核心功能是监听多个文件描述符(如socket、文件、信号等)的变化,并在这些描述...

    libevent参考手册中文版_libevent-2.1.5.pdf

    在版本状态方面,需要注意的是,不同版本的libevent可能在某些API上存在差异,因此,在使用时需要确保程序与所使用的libevent版本兼容。 手册接着描述了如何设置libevent。在这一部分,会讲解如何处理libevent中的...

    代码 libevent 使用

    代码 libevent 使用

    【最新】C++ 使用libEvent实现http的post, get功能

    4. **设置回调函数**:libEvent使用事件回调机制,我们需要定义一个回调函数来处理HTTP响应。当请求完成时,libEvent会调用这个函数。 5. **发起请求**:使用`http_client_request`函数发起请求。这个函数会将请求...

    libevent参考手册(中文版)_libevent-2.1.5-beta.pdf

    7. 释放全局Libevent结构:在程序退出前,确保释放libevent使用的全局资源。 创建event_base是使用libevent时的一个重要步骤,event_base是libevent的事件循环核心,libevent支持多种事件后端,可以通过event_base...

    libevent-devel-2.0.21-4.el7.x86_64.rpm

    1. **事件通知机制**:libevent使用内核的epoll(在Linux下)或者其他类似机制,监控多个文件描述符的状态变化,当某个描述符准备就绪时,libevent会通知应用程序。 2. **多种事件模型**:libevent支持多种事件模型...

    libevent源码分析

    libevent使用哈希表来实现高效的数据存储和检索,例如event_io_map结构体的哈希结构体和哈希函数等。 9. event_signal_map 相关结构体和操作函数是libevent处理信号事件的关键部分,如信号捕捉函数和信号事件的激活...

    libevent安装包

    5. **内存管理**:libevent使用自己的内存池,减少内存分配和释放的开销。 6. **线程支持**:支持多线程环境,可以在多个线程之间共享事件处理。 **三、libevent的安装** 针对提供的文件`libevent-1.1a-3.2.1.i386...

    libevent 教程

    libevent 教程 libevent 是一个高效的异步 IO 库,提供统一的 API,简化开发。下面是 libevent 教程的知识点总结: ...通过学习和使用 libevent,可以快速构建高性能的网络服务器和客户端应用程序。

    libevent资料大全

    《Libevent使用例子,从简单到复杂.pdf》提供了libevent的实际应用场景,从基础的网络服务器创建到复杂的并发处理策略。这些示例代码可以帮助初学者快速上手,并逐步掌握libevent的高级用法。通过逐步进阶,开发者...

    libevent-master.zip

    3. **异步非阻塞 I/O**:libevent 使用异步非阻塞 I/O 模型,避免了在等待 I/O 操作完成时浪费 CPU 时间,提高了系统的并发性能。 4. **操作系统接口适配**:libevent 提供了跨平台的接口,底层根据不同操作系统...

    libevent.lib动态库,适合在windows下使用,版本为libevent2.1.8

    在实际开发中,Windows下的libevent使用流程大致如下: 1. **安装和配置**:首先,你需要将libevent的库文件(如libevent.lib)和头文件(通常位于include目录下)添加到你的项目路径中,确保编译器能够找到它们。 ...

    libevent源码和一个小例子

    在给定的描述中,虽然没有提供详细的文字信息,但提供了链接到一篇博客文章(由于这是一个文本环境,无法直接访问该链接,但我将基于通常的libevent使用场景和常见知识进行解释)。 根据描述中提到的博客文章,我们...

    libevent C++高并发网络编程

    #### 二、高并发网络模型与libevent使用 **2.1 高并发网络模型select_epoll_iocp的区别** - **select模型**: 是一种多路复用技术,通过轮询的方式来检查多个套接字的状态变化。 - **epoll模型**: 改进了select模型...

    windows_libevent_SDK.zip

    在不包含openssl的情况下,如果你的项目需要加密通信,你需要单独下载并编译openssl库,然后将openssl库链接到你的项目中,同时配置libevent使用openssl。具体步骤可以参考openssl和libevent的官方文档。 总之,...

    libevent多线程

    在多线程环境中使用 Libevent 可以帮助开发者构建能够处理大量并发连接的应用程序,尤其适用于服务器端软件。本文将深入探讨 Libevent 的多线程支持及其在高并发场景下的应用。 首先,让我们了解一下 Libevent 的...

    libevent参考手册(中文版).zip

    4. **回调函数**:libevent使用用户定义的回调函数来处理各种事件,当事件发生时,对应的回调会被调用。 5. **性能优化**:libevent通过使用非阻塞I/O和事件多路复用来提高性能,同时支持多线程环境下的事件分发。 ...

    libevent vs2013工程以及demo

    5. **事件多路复用**: Libevent 使用事件多路复用技术,允许程序同时监听多个事件源,提高效率。 **Libevent 的 ASIO 模块** Libevent 还提供了 ASIO 模块,它是 Boost.ASIO 库的一个轻量级实现,用于处理异步 I/O...

    libevent-1.4.2-rc库

    5. **内存管理**:libevent使用自己的内存池进行内存分配,减少了系统调用,提高了性能。 **libevent-1.4.2-rc版本特点** 1. **稳定性提升**:相对于早期版本,1.4.2-rc在功能完善和bug修复方面做了大量工作,提高...

Global site tag (gtag.js) - Google Analytics