c++中的mongoose服务器

mongoose server in c++

本文关键字:服务器 mongoose 中的 c++      更新时间:2023-10-16

我正在使用mongoose库在c++OOP中开发一个API服务器。我一直收到错误。有人可以查看我的代码并给我一些指针吗。embServer.h

   class embServer
{
private:
    constexpr static const char *s_http_port = "8000";
    constexpr static struct mg_serve_http_opts s_http_server_opts = { .document_root = "web_root" };  // C99;
    static int s_sig_num;
    constexpr static const struct mg_str s_get_method = MG_MK_STR("GET");
    constexpr static const struct mg_str s_put_method = MG_MK_STR("PUT");
    constexpr static const struct mg_str s_delele_method = MG_MK_STR("DELETE");

public:
    embServer();
    ~embServer();
    Database dbConn;
    //int embServer::s_sig_num = 0;

    static void signal_handler(int sig_num)
    {
        signal(sig_num, signal_handler);
        s_sig_num = sig_num;
    }
    static int has_prefix(const struct mg_str *uri, const struct mg_str *prefix)
    {
        return uri->len > prefix->len && memcmp(uri->p, prefix->p, prefix->len) == 0;
    }
    static int is_equal(const struct mg_str *s1, const struct mg_str *s2)
    {
        return s1->len == s2->len && memcmp(s1->p, s2->p, s2->len) == 0;
    }
    static void ev_handler(struct mg_connection *nc, int ev, void *ev_data)
    {
        static const struct mg_str api_prefix = MG_MK_STR("/api/v1");
        struct http_message *hm = (struct http_message *) ev_data;
        struct mg_str key;
        switch (ev)
        {
        case MG_EV_HTTP_REQUEST:
            if (has_prefix(&hm->uri, &api_prefix))
            {
                key.p = hm->uri.p + api_prefix.len;
                key.len = hm->uri.len - api_prefix.len;
                if (embServer::is_equal(&hm->method, &s_get_method))
                {
                    //dbConn.db_op(nc, hm, &key, 1);
                }
                else if (embServer::is_equal(&hm->method, &s_put_method))
                {
                    //dbConn.db_op(nc, hm, &key, 2);
                }
                else if (embServer::is_equal(&hm->method, &s_delele_method))
                {
                    //dbConn.db_op(nc, hm, &key, 3);
                }
                else
                {
                    mg_printf(nc, "%s","HTTP/1.0 501 Not Implementedrn" "Content-Length: 0rnrn");
                }
            }
            else
            {
                mg_serve_http(nc, hm, &s_http_server_opts); /* Serve static content */
           }
            break;
        default:
            break;
        }
    }
    void Run()
    {
        struct mg_mgr mgr;
        struct mg_connection *nc;
        //int i;
        /* Open listening socket */
        mg_mgr_init(&mgr, NULL);
        nc = mg_bind(&mgr, s_http_port, embServer::ev_handler);
        mg_set_protocol_http_websocket(nc);

        /* For each new connection, execute ev_handler in a separate thread */
        mg_enable_multithreading(nc);

        /**
        for (i = 1; i < argc; i++)
        {
            if (strcmp(argv[i], "-D") == 0)
            {
                mgr.hexdump_file = argv[++i];
            }
            else if (strcmp(argv[i], "-f") == 0)
            {
                s_db_path = argv[++i];
            }
            else if (strcmp(argv[i], "-r") == 0)
            {
                s_http_server_opts.document_root = argv[++i];
            }
        }
        Parse command line arguments */
        signal(SIGINT, &embServer::signal_handler);
        signal(SIGTERM, &embServer::signal_handler);
        /* Run event loop until signal is received */
        printf("Starting RESTful server on port %sn", s_http_port);
        while (s_sig_num == 0)
        {
            mg_mgr_poll(&mgr, 1000);
        }
        /* Cleanup */
        mg_mgr_free(&mgr);
        printf("Exiting on signal %dn", s_sig_num);

    }
 };
 int embServer::s_sig_num = 0;

错误显示

    `F:PROJECTSCPapiCrudembServer.h|48|warning: variable 'key' set but not used [-Wunused-but-set-variable]|
objDebugmain.o||In function `ZN9embServer10ev_handlerEP13mg_connectioniPv':|
F:PROJECTSCPapiCrudembServer.h|79|undefined reference to `embServer::s_http_server_opts'|
F:PROJECTSCPapiCrudembServer.h|79|undefined reference to `embServer::s_http_server_opts'|
F:PROJECTSCPapiCrudembServer.h|79|undefined reference to `embServer::s_http_server_opts'|
F:PROJECTSCPapiCrudembServer.h|79|undefined reference to `embServer::s_http_server_opts'|
F:PROJECTSCPapiCrudembServer.h|79|undefined reference to `embServer::s_http_server_opts'|
objDebugmain.o:F:PROJECTSCPapiCrudembServer.h|79|more undefined references to `embServer::s_http_server_opts' follow|
objDebugmain.o||In function `main':|
F:PROJECTSCPapiCrudmain.cpp|15|undefined reference to `embServer::embServer()'|
F:PROJECTSCPapiCrudmain.cpp|15|undefined reference to `embServer::~embServer()'|
F:PROJECTSCPapiCrudmain.cpp|15|undefined reference to `embServer::~embServer()'|
||error: ld returned 1 exit status|
||=== Build failed: 10 error(s),(0 minute(s), 22 second(s)) ===|`
int main(int argc, char *argv[])
{
    embServer emb;
    emb.Run();
    return 0;
}

编译器直接告诉您需要进行以下更改:

  1. constexpr添加到static struct mg_serve_http_opts s_http_server_opts
  2. mg_serve_http(nc, hm, &s_http_server_opts)中移除&