• 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 ", 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 ", 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 ", 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! ");

           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

  • 相关阅读:
    find the safest road
    杭电1874(畅通工程续)
    Red and Black
    运行和控制 Nginx 命令行参数和信号
    对中文版“Siri”打个招呼吧!
    《星际迷航》语音翻译器成真
    程序员丰厚的待遇能持续多久?
    Nginx 日志分析 AWStats + JAWStats 安装配置
    RHEL 5.4 + Nginx + Mediawiki
    麻省理工科技创业之:Win 8新概念
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3397825.html
Copyright © 2020-2023  润新知