@使用libevent搭建简单http服务器
一、libevent 的下载
可通过官网直接进行下载libevent库;例子使用的是V2.1.1版本,下载完成后,解压;可以再解压目录下获取 Makefile.nmake 文件,可通过nmake工具自己编译,注意编译的项目属性要与使用的版本一致,否则会出现编译异常的问题;下面链接是编译完成的VS2008版本MD和MT版本的静态库,可直接使用;如所需版本不同,请不要下载;
@VS2008_MD(MT)_staic_lib
二、下载完成后,开始搭建环境:
1,使用VS2008新建一个Win32控制台程序
![在这里插入图片描述](https://img-blog.csdnimg.cn/d4d6a03b1066468b96b35a4dd9f23278.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATVhUMDMxMQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
2,新建一个.h的头文件,作为http类的头文件,并将包含头文件和库文件;同样也可再项目属性中添加依赖库文件和包含头文件的形式添加;
![在这里插入图片描述](https://img-blog.csdnimg.cn/a04790fa1aaa4352ab54d2be67e338d4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATVhUMDMxMQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/7fee5c0d293c42f58fe2c9fbefca5387.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATVhUMDMxMQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
3,声明一个http的类,并声明其成员变量,如http_Start 函数作为启动http服务的成员函数;
![在这里插入图片描述](https://img-blog.csdnimg.cn/507eb47d1f4447e1920a3f009c798cde.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATVhUMDMxMQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
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;
}
evhttp_set_timeout(http_server, 1000);
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()这个函数,如果没有增加这个函数,无法在多线程编程中使用;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)