一、libevent 的下载
可通过官网直接进行下载libevent库;例子使用的是V2.1.1版本,下载完成后,解压;可以再解压目录下获取 Makefile.nmake 文件,可通过nmake工具自己编译,注意编译的项目属性要与使用的版本一致,否则会出现编译异常的问题;下面链接是编译完成的VS2008版本MD和MT版本的静态库,可直接使用;如所需版本不同,请不要下载;
@VS2008_MD(MT)_staic_lib
二、下载完成后,开始搭建环境:
1,使用VS2008新建一个Win32控制台程序
2,新建一个.h的头文件,作为http类的头文件,并将包含头文件和库文件;同样也可再项目属性中添加依赖库文件和包含头文件的形式添加;
3,声明一个http的类,并声明其成员变量,如http_Start 函数作为启动http服务的成员函数;
4,创建一个.cpp文件,作为http类的实现文件;主要讲解http搭建的过程;主要用到函数如下:
a,WSAStartup 函数,启动winows异步套接字,调用前需要包含以下内容
#include <winsock2.h>
#pragma comment (lib,"Iphlpapi.lib")
b,event_base_new() 函数:使用libevent前需要创建一个或者多个event_base结构体,每个event_base 结构 体持有一个事件集合,可以检测以确定哪个事件是激活的;
c,evhttp_new()函数:创建http服务;
d,evhttp_bind_socket()函数,绑定服务地址及端口;
e,evhttp_set_timeout()函数,设置超时时间
f,evhttp_set_cb() 函数,注册事件;
g,event_base_dispatch()函数,设置循环监听;
h,event_free() 函数,释放http服务;
通过以上步骤可创建出一个简单的http服务,代码如下:
int Http::http_Start()
{
//初始化套接字
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
ERROR_LOG("初始化套接字失败.\n");
return HTTP_STARTUP_FAILED;
}
//支持多线程属性,
evthread_use_windows_threads();
//初始化服务
struct event_base* base = event_base_new();
if (!base)
{
ERROR_LOG("创建Event_base 失败.\n");
return HTTP_NEW_BASE_FAILED;
}
struct evhttp* http_server = evhttp_new(base);
if (!http_server)
{
return HTTP_NEW_SERVER_FAILED;
}
DEBUG_LOG("创建http服务成功.");
//绑定
if (evhttp_bind_socket(http_server, SERVICE_ADDR, http_uBusiness_Port) != 0)
{
sprintf(ErrInfo,"绑定业务IP及端口失败,端口:%u", http_uBusiness_Port);
ERROR_LOG(ErrInfo);
return HTTP_BIND_SOCKET_FAILED;
}
//绑定心跳包机制
/*if (evhttp_bind_socket(http_KeepAliveServer, SERVICE_ADDR, http_uKeepAlive_Port) != 0)
{
return -1;
}*/
//设置超时时间
evhttp_set_timeout(http_server, 1000);
//绑定注册事件,其中http_handler_Callback_Post 为消息处理函数;
evhttp_set_cb(http_server,"/TransVideo",http_handler_Callback_Post,this);
//设置循环监听
event_base_dispatch(base);
//释放
evhttp_free(http_server);
return SUCCESS;
}
特别注意:evthread_use_windows_threads()这个函数,如果没有增加这个函数,无法在多线程编程中使用;