• vs2010下libevent的使用



    下载最新的libevent,目前是

    libevent-2.0.21-stable.tar.gz


    修改“D:libevent-2.0.21-stableevent_iocp.c”、“D:libevent-2.0.21-stable evthread_win32.c”、“D:libevent-2.0.21-stablelistener.c”三个文件,在文件开头分别加上一 行:

    #define _WIN32_WINNT 0x0500

    在Makefile.nmake中的CFLAGS中加入/ZI选项,同时去掉/Ox优化选项,这样生成的lib库会带有调试信息 

    进入VS2010命令提示

    切换到libevent的所在目录

    nmake /f Makefile.nmake

    编译成功生成

    libevent.lib、libevent_core.lib、libevent_extras.lib


    复制include 和libs

    mkdir D:libeventinclude
    xcopy /E /H /R D:libevent-2.0.21-stableinclude* D:libeventinclude
    xcopy /E /H /R D:libevent-2.0.21-stableWIN32-Code* D:libeventinclude
    xcopy /E /H /R D:libevent-2.0.21-stable*.h D:libeventinclude
    mkdir d:libeventlibs
    copy D:libevent-2.0.21-stable*.lib D:libeventlibs

     新建vs2010控制台项目并使用以下代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    // libeventTest.cpp : Defines the entry point for the console application.
    //
     
    #include "stdafx.h"
    /*
     * XXX This sample code was once meant to show how to use the basic Libevent
     * interfaces, but it never worked on non-Unix platforms, and some of the
     * interfaces have changed since it was first written.  It should probably
     * be removed or replaced with something better.
     *
     * Compile with:
     * cc -I/usr/local/include -o event-test event-test.c -L/usr/local/lib -levent
     */
     
    #include <event2/event-config.h>
     
    #include <sys/types.h>
    #include <sys/stat.h>
    #ifndef WIN32
    #include <sys/queue.h>
    #include <unistd.h>
    #include <sys/time.h>
    #else
    #include <winsock2.h>
    #include <windows.h>
    #endif
    #include <fcntl.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
     
    #include <event.h>
     
    static void
    fifo_read(int fd, short event, void *arg)
    {
    char buf[255];
    int len;
    struct event *ev = (struct event *)arg;
    #ifdef WIN32
    DWORD dwBytesRead;
    #endif
     
    /* Reschedule this event */
    event_add(ev, NULL);
     
    fprintf(stderr, "fifo_read called with fd: %d, event: %d, arg: %p ",
    fd, event, arg);
    #ifdef WIN32
    len = ReadFile((HANDLE)fd, buf, sizeof(buf) - 1, &dwBytesRead, NULL);
     
    /* Check for end of file. */
    if (len && dwBytesRead == 0) {
    fprintf(stderr, "End Of File");
    event_del(ev);
    return;
    }
     
    buf[dwBytesRead] = '';
    #else
    len = read(fd, buf, sizeof(buf) - 1);
     
    if (len == -1) {
    perror("read");
    return;
    } else if (len == 0) {
    fprintf(stderr, "Connection closed ");
    return;
    }
     
    buf[len] = '';
    #endif
    fprintf(stdout, "Read: %s ", buf);
    }
     
    int
    main(int argc, char **argv)
    {
    struct event evfifo;
    #ifdef WIN32
    HANDLE socket;
    /* Open a file. */
    socket = CreateFileA("test.txt",    /* open File */
    GENERIC_READ,    /* open for reading */
    0,   /* do not share */
    NULL,    /* no security */
    OPEN_EXISTING,   /* existing file only */
    FILE_ATTRIBUTE_NORMAL,  /* normal file */
    NULL);   /* no attr. template */
     
    if (socket == INVALID_HANDLE_VALUE)
    return 1;
     
    #else
    struct stat st;
    const char *fifo = "event.fifo";
    int socket;
     
    if (lstat(fifo, &st) == 0) {
    if ((st.st_mode & S_IFMT) == S_IFREG) {
    errno = EEXIST;
    perror("lstat");
    exit(1);
    }
    }
     
    unlink(fifo);
    if (mkfifo(fifo, 0600) == -1) {
    perror("mkfifo");
    exit(1);
    }
     
    /* Linux pipes are broken, we need O_RDWR instead of O_RDONLY */
    #ifdef __linux
    socket = open(fifo, O_RDWR | O_NONBLOCK, 0);
    #else
    socket = open(fifo, O_RDONLY | O_NONBLOCK, 0);
    #endif
     
    if (socket == -1) {
    perror("open");
    exit(1);
    }
     
    fprintf(stderr, "Write data to %s ", fifo);
    #endif
    /* Initalize the event library */
    event_init();
     
    /* Initalize one event */
    #ifdef WIN32
    event_set(&evfifo, (int)socket, EV_READ, fifo_read, &evfifo);
    #else
    event_set(&evfifo, socket, EV_READ, fifo_read, &evfifo);
    #endif
     
    /* Add it to the active events, without a timeout */
    event_add(&evfifo, NULL);
     
    event_dispatch();
    #ifdef WIN32
    CloseHandle(socket);
    #endif
    return (0);
    }

    进入配置管理器,设置活动项目为release


    C++常规附加包含目录 .include;.includeevent2

    代码生成运行库 多线程 (/MT)
    高级编译为 编译为 C 代码 (/TC)

    链接器

    常规附加库目录 .libs
    输入附加依赖项 ws2_32.lib;wsock32.lib;libevent.lib;libevent_core.lib;libevent_extras.lib;%(AdditionalDependencies)
    输入忽略特定默认库 libc.lib;msvcrt.lib;libcd.lib;libcmtd.lib;msvcrtd.lib;%(IgnoreSpecificDefaultLibraries)


    haven2002标注:不用忽略也没事

    include文件夹下面,包含event2文件夹和一堆.h文件即可。用上面的命令,复制了一堆没用的东西。


  • 相关阅读:
    面试java_后端面经_5
    头条后端面经_1面
    面试java后端面经_2
    java后端开发面经 数据库相关
    用友java后端开发面经
    面试java后端面经_4
    维恩贝特面试JAVA后台开发
    面试java后端面经_3
    世纪龙校招java开发一、二面 面经
    AndroidWebView使用
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318330.html
Copyright © 2020-2023  润新知