1     引子

手头上有一个使用了4个年头的HttpClient库,自己封装的,对于集成了IE浏览器的应用程序很友好。但最近想把产品扩展到Chrome和FireFox阵营,萌发了重构HttpClient的想法,自此便再也抑制不住冲动了。考察了很多的C++网络库,最终选定了libevent,没别的,一开源,二轻量,三没有额外的依赖库,四对VS很友好,喜不自禁。

2     编译

2.1   下载

从官网http://libevent.org/下载了最新的stable代码包(libevent-2.0.21-stable.tar.gz),解压到F:\libevent-2.0.21-stable。

2.2   准备编译

直接打开解压目录下的Makefile.nmake,找到:

# Needed for correctness

CFLAGS=/IWIN32-Code /Iinclude/Icompat /DWIN32 /DHAVE_CONFIG_H /I.

在CFLAGS这一行添加/MT编译命令,修改后如下:

CFLAGS=/IWIN32-Code /Iinclude/Icompat /DWIN32 /DHAVE_CONFIG_H /I. /MT

其次,找到:

LIBFLAGS=/nologo

在后面添加NODEFAULTLIB命令,修改然后如下:

LIBFLAGS=/nologo/NODEFAULTLIB:"libc.lib"

OK,可以保存了。

2.3   编译

直接在菜单中找到VS命令行(我用的是VS2003,理论上讲VS2005及以后的版本都是一样的操作):

在命令行中,先切换到libevent的解压目录(F:\libevent-2.0.21-stable),然后使用nmake命令进行编译:

nmake /f Makefile.nmake

编译完之后,我们要使用的三个库libevent.lib、libevent_core.lib和libevent_extras.lib已经妥妥的生成好了(就在F:\libevent-2.0.21-stable下)。

编译的后期会报出些错误,那是在编译test目录下的文件时出了问题,但那已经无关紧要了。当然,如果有兴趣的话,可以接着去修改test目录下的Makefile.nmake文件。

另外,关于命令行,也可以直接运行cmd进行编译,前提是能寻址到nmake命令,以及VS相关设置在环境变量中都已设置好。

3     使用

3.1   创建Win32 Console工程

创建一个最简单的Win32 Console(中文叫Win32控制台)工程,默认设置即可。

3.2   准备libevent库

在工程目录下分别创建inc和lib目录。

把libevent解压目录下的所有.h文件复制到inc目录。

把libevent解压目录下的include下的event2目录复制到inc目录。

把libevent解压目录下的WIN32-Code下的event2目录和tree.h复制到inc目录。

把libevent解压目录下编译生成的3个.lib文件(libevent.lib、libevent_core.lib和libevent_extras.lib)复制到lib目录。

3.3   添加代码

修改stdafx.h文件,内容如下:

#pragma once

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>

#include <tchar.h>

#include <windows.h>

#include <winsock2.h>

#include <event.h>

#include <evhttp.h>

接着,修改跟工程同名的.cpp文件(初始内容就一个main函数),内容如下:

#include "stdafx.h"

void root_handler(structevhttp_request *req, void *arg)

{

structevbuffer       *buf = evbuffer_new();

if(!buf)

{

puts("failedto create response buffer");

return;

}

evbuffer_add_printf(buf,"Hello: %s\n", evhttp_request_uri(req));

evhttp_send_reply(req,HTTP_OK, "OK", buf);

}

void generic_handler(structevhttp_request *req, void *arg)

{

structevbuffer       *buf = evbuffer_new();

if(!buf)

{

puts("failedto create response buffer");

return;

}

evbuffer_add_printf(buf,"Requested: %s\n", evhttp_request_uri(req));

evhttp_send_reply(req,HTTP_OK, "OK", buf);

}

int _tmain(int argc, _TCHAR* argv[])

{

structevhttp    *httpd;

WSADATA     wsaData;

DWORD Ret;

if((Ret= WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)

{

printf("WSAStartupfailed with error %d\n", Ret);

return-1;

}

event_init();

httpd= evhttp_start("0.0.0.0", 80);

if(!httpd)return1;

evhttp_set_cb(httpd,"/", root_handler, NULL);

evhttp_set_gencb(httpd,generic_handler, NULL);

printf("httpdserver start OK!\n");

event_dispatch();

evhttp_free(httpd);

WSACleanup();

return0;

}

3.4   修改工程设置

在常规设置中字符集设置为MBCS。

在C++常规项中,添加附加包含目录:inc;inc/event2。

在C++代码生成中,修改运行时库为MTd(Release模式下,设置为MT)。

在链接器常规项中,添加附加目录:lib。

在链接器输入项中,添加依赖项:ws2_32.libwsock32.lib libevent.lib libevent_core.lib libevent_extras.lib。

在链接器输入项中,添加忽略指定库:libcmt.lib(Release模式下空着就行)。

3.5   编译&测试

编译吧,骚年。

如果一切顺利,运行起来,会在命令行窗口中显示“httpd server start OK!”。

要是运气不济,可以到代码中找到httpd =evhttp_start("0.0.0.0", 80);

这里的80是指程序监听的端口,很可能跟本地其他程序冲突了。如果是这样,就改个其他的值吧(比如8080)。

打开浏览器,在地址栏输入“http://localhost/hello,libevent.”,如果浏览器显示“Requested: /hello,libevent.”即代表RP爆表了(如果是其他,那就继续自力更生吧)。

3.6   代码下载

http://download.csdn.net/detail/lonely001/6474967

Windows平台下libevent库的使用的更多相关文章

  1. [转]Windows平台下Makefile学习笔记

    Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...

  2. windows平台下VLC2.0.5编译

    windows平台下VLC2.0.5编译说明 时隔一年多,又要搞流媒体了,不过这次是要做流媒体服务器. 暂时决定使用vlc+ffmpeg+live555,虽然听有些前辈说这个组合的性能较差,只能作为学 ...

  3. 在Windows平台下Qt的exe报错问题排查步骤

    在Windows平台下Qt的exe报错问题排查步骤 工具介绍: 1. Dependency Worker Dependency Worker是一个免费的用具用来扫描任何的32bit 或者64bit 的 ...

  4. Windows平台下Qt QOpenGL中glutSolidSphere()方法未定义的解决方法

    Windows平台下Qt中glut库的使用     用Qt中的QGLWidget窗体类中是不包括glut工具库的,难怪在myGLWidget(在我的程序中是QGLWidget的派生类)中绘制实心球体是 ...

  5. Windows平台下MySQL常用操作与命令

    Windows平台下MySQL常用操作与命令 Windows平台下MySQL常用操作与命令,学习mysql的朋友可以参考下. 1.导出整个数据库 mysqldump -u 用户名 -p --defau ...

  6. 【VS开发】Windows平台下Makefile学习笔记

    作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开 ...

  7. Windows平台下Git服务器搭建

    第一步:下载Java,下载地址:http://www.java.com/zh_CN/ 第二步:安装Java.安装步骤不再详述. 第三步:配置Java环境变量. 右键”计算机” => ”属性” = ...

  8. Windows平台下PHP开发环境的配置

    Windows平台下PHP开发环境的配置 一.基本环境 1.Windows XP 32位 2.Apache 2.2.25,下载地址:http://mirror.bit.edu.cn/apache/ht ...

  9. Mac平台与Windows平台下AndroidStudio增量升级

    Android Studio增量升级什么情况下使用最合适呢? 比如现在的as版本是2.2版本,而你的as版本2.0版本,这个时候点Check For Updates就没有反应了,因为你已经2个有版本没 ...

随机推荐

  1. 【转】webgame前台开发总结--虽然是10年的文章,但是也有参考价值

    一.webgame整个游戏流程: 1.预加载(打开游戏页面后,显示进度条,主要加载前期的登陆和创建角色资源,创建角色资源的加载可以放到进入创建角色界面的时候加载,因为玩家除了第一次进入游戏,其他时间基 ...

  2. js 发红包

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  3. 轻松学习Linux之Shell文件和目录属性详解

    轻松学习Linux之Shell文件和目录属性详解 轻松学习Linux之理解Sitcky 轻松学习Linux之理解umask 轻松学习Linux之理解SUID&SGUID 本系列多媒体教程已完成 ...

  4. 成为IBM精英讲师-一分耕耘 一份收获 同时也多了一份责任!

    成为IBM精英讲师 一分耕耘 一份收获 同时也多了一份责任! http://www.webspherechina.net/?action-iste-type-lecturerlist 650) thi ...

  5. 第三百四十八天 how can I 坚持

    回来的倒不晚,算了不想抱怨了. 晚上回来吃过饭,又看了遍<活着>,把一切悲剧都放在一个人身上了,很朴实,好感人. 一天就写了一个借口,也是醉了. 我的天气预报,我的struts.sprin ...

  6. 第一百九十五天 how can I 坚持

    晚上回来又肚子疼,拉肚子,咋搞的呢. 小米.华为.感觉虽然现在华为有些许优势,哎,还是不说了,感觉小米手机信号好像有问题. 中午吃的刀削面好像不熟,其实,怎么说呢,像开面馆,做的面顾客都吃不完,很明显 ...

  7. XE10 Seattle error___seh_personality_v0

    Seattle bcc32c compiler error [ilink32 Error] Error: Unresolved external '___seh_personality_v0' ref ...

  8. Clean Code第三章<函数>

    1.方法不要写太长,如果太长,抽取其中的逻辑到新的方法中 bad good 2.函数只做一件事 如果做了多件事,要在方法名里体现出来 3.每个函数一个抽象层级 4.函数名可以长一些,比长注释好 5.方 ...

  9. 给windows 7安装文件添加USB3.0驱动

    给Air安装win7进入语言与区域选择之后,发现键盘触摸板都失灵.   原因:新款的 Macbook Air 2013 因为使用了 USB3.0 端口键盘和触摸板设备,所以在安装 Windows 7 ...

  10. TPARAMS和OLEVARIANT相互转换

    所谓的“真3层”有时候是需要客户端上传数据集的TPARAMS到中间件的. 现在,高版本的DATASNAP的远程方法其实也是直接可以传输TPARAMS类型的变量,但是DELPHI7(七爷).六爷它们是不 ...