Windows平台下libevent库的使用
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库的使用的更多相关文章
- [转]Windows平台下Makefile学习笔记
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...
- windows平台下VLC2.0.5编译
windows平台下VLC2.0.5编译说明 时隔一年多,又要搞流媒体了,不过这次是要做流媒体服务器. 暂时决定使用vlc+ffmpeg+live555,虽然听有些前辈说这个组合的性能较差,只能作为学 ...
- 在Windows平台下Qt的exe报错问题排查步骤
在Windows平台下Qt的exe报错问题排查步骤 工具介绍: 1. Dependency Worker Dependency Worker是一个免费的用具用来扫描任何的32bit 或者64bit 的 ...
- Windows平台下Qt QOpenGL中glutSolidSphere()方法未定义的解决方法
Windows平台下Qt中glut库的使用 用Qt中的QGLWidget窗体类中是不包括glut工具库的,难怪在myGLWidget(在我的程序中是QGLWidget的派生类)中绘制实心球体是 ...
- Windows平台下MySQL常用操作与命令
Windows平台下MySQL常用操作与命令 Windows平台下MySQL常用操作与命令,学习mysql的朋友可以参考下. 1.导出整个数据库 mysqldump -u 用户名 -p --defau ...
- 【VS开发】Windows平台下Makefile学习笔记
作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开 ...
- Windows平台下Git服务器搭建
第一步:下载Java,下载地址:http://www.java.com/zh_CN/ 第二步:安装Java.安装步骤不再详述. 第三步:配置Java环境变量. 右键”计算机” => ”属性” = ...
- Windows平台下PHP开发环境的配置
Windows平台下PHP开发环境的配置 一.基本环境 1.Windows XP 32位 2.Apache 2.2.25,下载地址:http://mirror.bit.edu.cn/apache/ht ...
- Mac平台与Windows平台下AndroidStudio增量升级
Android Studio增量升级什么情况下使用最合适呢? 比如现在的as版本是2.2版本,而你的as版本2.0版本,这个时候点Check For Updates就没有反应了,因为你已经2个有版本没 ...
随机推荐
- win7 共享的问题,"您可能没有权限使用网络资源"的解决办法
重点来了,如果以上方法都不行的话,下面这个绝对有效,本人屡试不爽.1 打开受访者的guest权限2 开始--运行--gpedit.msc3 windows设置---安全设置--本地策略--用户权利指派 ...
- Mac下用命令行直接批量转换文本编码到UTF8
由于近期在Mac下写Android程序,下载的一些Demo由于编码问题源码里的汉字出现乱码,文件比较多,所以想批量解决下文件的编码问题. Mac下有以下两种方式可以解决: A. 文件名的编码:Mac的 ...
- linux3.0.4编译LDD中的scull全过程
按照惯例,我是应该先写一些本章的收获的,不过太晚了. 在看完第三章之后开始编译,错误一堆,几乎崩溃,幸亏经过不断的百度,总算解决了问题,我发现 我遇到问题比较多,算是集中七个龙珠了吧,感谢先行的大神们 ...
- sudo 权限问题
窝里个去,不使用sudo吧rvm requirements执行不成功.加上sudo吧rvm requirements调用的brew install又不行.好吧,就按上面说的将brew转换到root模式 ...
- permission denied部署django 遇到没有python_egg_cache的问题解决
检查/etc/httpd/logs/error_log,看是否有如下错误: [Errno 13] Permission denied: '/var/www/.python-eggs' 这时候需要编辑“ ...
- java.io.IOException: Messenger was closed
程序运行一段时间后抛出异常java.io.IOException: Messenger was closed,不知道是啥原因? ———————————————————————————————————— ...
- 4.VS2010C++建立DLL工程
相关资料: http://blog.csdn.net/jshayzf/article/details/23608705 http://blog.csdn.net/huang_xw/article/de ...
- python知识点 07-11
python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 python的 nonlocal关键字用来在函数或其他作用域中使用 ...
- linux极点五笔无法输入词组_ibus设置
菜鸟学linux——用的是ubuntu 不知道是不是按个哪些快捷键,极点五笔突然无法输入词组.那个抓狂啊 没关系,设置一下就ok 第一步:右上角输入法,右键——>首选项——>常规——> ...
- 时隔3年,再次折腾BlackBerry 8830!
2010年手头换得8830,之后就是好几番刷机.解SPC.倒腾各种软件..算软件注册码..那个时候记得最难弄的注册码就是crunchSMS.需要运行虚拟机来从内存地址读取注册码..不过黑莓真的很经得起 ...