• [原]网络库libevent在Visual Studio中的使用方法


      libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到跨平台,而且根据libevent官方网站上公布的数据统计,似乎也有着非凡的性能。

    1、下载编译libevent

      下载当前最新的libevent稳定版本libevent-2.0.21-stable.tar.gz安装包,解压到某个固定目录。打开Visual Studio的Command Prompt终端,进入libevent-2.0.21-stable目录,输入如下指令编译libevent代码库:

    nmake /f Makefile.nmake

    2、收集libevent相关头文件和库文件

      libevent编译完成后,生成的相关静态库文件包括三个:libevent.lib libevent_core.lib libevent_extras.lib,可以单独建立一个lib文件夹存放;

      相关的头文件包括三个地方:(1)libevent-2.0.12-stableinclude*   (2)libevent-2.0.12-stableWIN32-Code*    (3)libevent-2.0.12-stable*.h

    把这些头文件都复制一下放到一个单独的include文件夹中方便管理。

    3、在VS工程中指定libevent的include和lib文件夹

      有两个地方指定:(1)新建一个工程后,在工程的“配置属性”-->“C/C++”-->“常规”-->“附加包含目录”中给出include文件夹路径;(2)直接在VS“工具”-->“选项”-->“项目和解决方案”-->“VC++目录”中给出include和lib目录路径。

      相比而言,第一种方式我发现在代码中虽然编译不会出错,但是不能自动定位头文件和函数位置;第二种方式就能够清晰定位出libevent头文件和函数的位置。

    4、设置工程“运行时库”属性

      在工程的“配置属性”-->“C/C++”-->“代码生成”-->“运行时库”中选择“多线程(/MT)”(这里需要与Libevent库选择相同的编译版本,如果Libevent是Debug版本静态库,则可选择/MD)

    5、设置工程依赖和忽略函数库

      在工程的“配置属性”-->“链接器”-->“输入”中指出“附加依赖项”包括:ws2_32.lib wsock32.lib libevent.lib libevent_core.lib libevent_extras.lib

      这一步的必要性在于,要使用libevent库中的函数,必须要把函数的定义库链接进来。其实,在代码中让编译器连接也是一样的,等价于在代码中添加如下语句:

    #include <WinSock2.h>
    #include "event.h"
    
    #pragma comment(lib, "ws2_32.lib")
    #pragma comment(lib, "libevent.lib")
    #pragma comment(lib, "libevent_core.lib")
    #pragma comment(lib, "libevent_extras.lib")

    6、测试代码

      来一段测试代码试一下:

     1 #include <stdio.h>
     2 #define WIN32_LEAN_AND_MEAN
     3 #include <windows.h>
     4 #include <winsock2.h>
     5 #include <event2/event.h>
     6 #include <event2/bufferevent.h>
     7 #include <event2/buffer.h>
     8 #include <evhttp.h>
     9 void root_handler(struct evhttp_request *req, void *arg)
    10 {
    11     struct evbuffer *buf = evbuffer_new();
    12     if(!buf)
    13     {
    14         puts("failed to create response buffer");
    15         return;
    16     }
    17     evbuffer_add_printf(buf, "Hello: %s
    ", evhttp_request_uri(req));
    18     evhttp_send_reply(req, HTTP_OK, "OK", buf);
    19 }        
    20 
    21 void generic_handler(struct evhttp_request *req, void *arg)
    22 {
    23     struct evbuffer *buf = evbuffer_new();
    24     if(!buf)
    25     {
    26         puts("failed to create response buffer");
    27         return;
    28     }
    29     evbuffer_add_printf(buf, "Requested: %s
    ", evhttp_request_uri(req));
    30     evhttp_send_reply(req, HTTP_OK, "OK", buf);
    31 }
    32 
    33 int main(int argc, wchar_t* argv[])
    34 {
    35     struct evhttp *httpd;    
    36     WSADATA wsaData;
    37     DWORD Ret;
    38     if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
    39     {
    40         printf("WSAStartup failed with error %d
    ", Ret);
    41         return -1;
    42     }
    43     event_init();
    44     httpd = evhttp_start("0.0.0.0", 8505);
    45     if(!httpd)
    46     {
    47         return 1;
    48     }
    49     evhttp_set_cb(httpd, "/", root_handler, NULL);
    50     evhttp_set_gencb(httpd, generic_handler, NULL);
    51     printf("httpd server start OK!
    ");
    52     event_dispatch();
    53     evhttp_free(httpd);
    54     WSACleanup();
    55     return 0;
    56 }
    View Code
  • 相关阅读:
    CAS-认证流程
    SSO-基本概念
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
  • 原文地址:https://www.cnblogs.com/kuliuheng/p/3978951.html
Copyright © 2020-2023  润新知