zoukankan      html  css  js  c++  java
  • libevent 使用记录(if_nametoindex、应用程序没有调用 WSAStartup问题)

    libevent官网: https://libevent.org/

    编译

    windows 下编译(编译前需要改写东西,尽量和文章中的版本一致,不一致有可能会编译失败);

    编译成功后,会得到libevent.lib、libevent_core.lib、libevent_extras.lib三个库文件

    32位编译: 

    参考: 32位编译(libevent-2.0.22-stable),注意#define _WIN32_WINNT 0x0500 添加到4个文件的第一行,像这样(event_iocp.c):

     ,总之,一定要添加在#ifndef _WIN32_WINNT上边!

    64位编译:

    参考: 64位编译(libevent-2.1.11-stable),修改Makefile.nmake文件,添加/MACHINE:X64

    注意: 在编译时会有错,只要三个lib(libevent.lib、libevent_core.lib、libevent_extras.lib)文件编译出来就可以了。

    使用

    1. 打开VS属性(注意选择当前32/64位配置)->VC++目录->包含目录,添加libevent目录下的include文件夹

    2. VS属性(注意选择当前32/64位配置)->VC++目录->库目录, 添加编译好的lib所在文件夹

    3. 添加lib库:VS属性->链接器->输入->附加依赖项: 

    Iphlpapi.lib
    ws2_32.lib
    wsock32.lib
    libevent.lib
    libevent_core.lib
    libevent_extras.lib

    Visual Studio 中使用遇到的问题:

    0. 注意选择当前32/64位配置,这总是我犯的一个低级问题,项目选择的64位,属性中却编辑的32位配置。

    1. 无法打开包括文件: event2/event-config.h

    打开libevent目录,进入WIN32-Code makeevent2,例如我的:E:devc++worklibevent-2.1.12-stablelibevent-2.1.12-stableWIN32-Code makeevent2

    复制event-config.h到{VS项目指向的include文件夹}/event2/下。

    {VS项目指向的include文件夹}就是刚刚设置的项目属性->VC++目录->包含目录中设置的libevent include路径.

    2.错误 LNK2019 无法解析的外部符号 if_nametoindex,该符号在函数 evutil_inet_pton_scope 中被引用

     在附加依赖项中没有添加Iphlpapi.lib.

    3. 警告 LNK4098 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

     VS属性->链接器->输入->忽略特定默认库->添加LIBCMT

    4. 执行event_init()提示[warn] signal.c: socketpair: 应用程序没有调用 WSAStartup,或者 WSAStartup失败。

    或: [warn] evsig_init: socketpair: Successful WSAStartup not yet performed [WSANOTINITIALISED ]
    [warn] socket: Successful WSAStartup not yet performed [WSANOTINITIALISED ]

    event_init()调用前,添加:

    #include <stdio.h>
    #include <iostream>
    #include <event.h>
    #include <event2/http.h>
    #include <event2/http_struct.h>
    #include <event2/http_compat.h>
    #include <event2/event-config.h>
    using namespace std;
    
    int main(void) {
        WSADATA wsa_data;
        WSAStartup(0x0201, &wsa_data);
        event_init();
        char *httpd_option_listen = "0.0.0.0";
        int httpd_option_port = 8080;
        struct evhttp *evHttp = evhttp_start(httpd_option_listen, httpd_option_port);
        if (evHttp == NULL) {
            cout << "错误!";
            getchar();
            return 0;
        }
        evhttp_set_timeout(evHttp, 5);
        evhttp_set_cb(evHttp, "/get", [](struct evhttp_request * req, void * data) {
             size_t len = evbuffer_get_length(req->input_buffer);
            cout << "req len:" << len;
            evbuffer *respBuff = evbuffer_new();
            evbuffer_add_printf(respBuff, "Hello ? World!");
            evhttp_send_reply(req, HTTP_OK, "Client", respBuff);
            evbuffer_free(respBuff);
        }, NULL);
    
        event_dispatch();
        evhttp_free(evHttp);
        return 0;
    }

    参考: https://www.cnblogs.com/nanzhi/p/7883911.html(32位编译)

    参考: https://blog.csdn.net/d137578736/article/details/104499194(64位编译)

    参考: https://blog.csdn.net/wwyyxx26/article/details/108918425(无法解析的外部符号 if_nametoindex)

  • 相关阅读:
    假期第九天
    假期第八天
    8.9周总结
    构建之法阅读笔记之三
    构建之法阅读笔记之二
    构建之法阅读笔记之一
    03人月神话阅读笔记之一
    手机输入法使用评价
    十天冲刺-第十天
    十天冲刺-第九天
  • 原文地址:https://www.cnblogs.com/GengMingYan/p/15491640.html
Copyright © 2011-2022 走看看