• C++ http服务


    1.需要使用c++提供http服务,本来想使用libevent,但是经过一番搜索后,发现了只需要引用2个文件的mongoose库。

    官方文档:https://cesanta.com/docs/overview/intro.html

    官方代码:https://github.com/cesanta/mongoose

    2.相关代码

    #include "HttpService.h"
    
    struct mg_serve_http_opts HttpService::s_http_server_opts;
    
    //请求事件处理
    void HttpService::mgEvHandler(struct mg_connection *nc, int ev, void *p) {
        //处理request
        if (ev == MG_EV_HTTP_REQUEST) {
            struct http_message *msg = (struct http_message *)p;
    
            //body内容
            char* body = new char[msg->body.len + 1];
            memset(body, 0, msg->body.len + 1);
            memcpy(body, msg->body.p, msg->body.len);
    
            //uri内容
            char* uri = new char[msg->uri.len + 1];
            memset(uri, 0, msg->uri.len + 1);
            memcpy(uri, msg->uri.p, msg->uri.len);
    
            //返回body信息
            mgSendBody(nc, "body content");
    
            //返回下载文件
            //mgSendFile("相对于s_http_server_opts.document_root的文件路径");
    
            delete uri;
            delete body;
        }
    }
    
    //发送body信息
    void HttpService::mgSendBody(struct mg_connection *nc, const char *content) {
        mg_send_head(nc, 200, strlen(content), "Content-Type: text/plain
    Connection: close");
        mg_send(nc, content, strlen(content));
        nc->flags |= MG_F_SEND_AND_CLOSE;
    }
    
    //发送文件,文件的位置是相对于s_http_server_opts.document_root的路径
    void HttpService::mgSendFile(struct mg_connection *nc, struct http_message *hm, const char* filePath) {
        mg_http_serve_file(nc, hm, filePath, mg_mk_str("text/plain"), mg_mk_str(""));
    }
    
    //初始化并启动
    bool HttpService::start(const char *port) {
        struct mg_mgr mgr;
        struct mg_connection *nc;
    
        mg_mgr_init(&mgr, NULL);
        printf("Starting web server on port %s
    ", port);
        nc = mg_bind(&mgr, port, mgEvHandler);
        if (nc == NULL) {
            printf("Failed to create listener
    ");
            return false;
        }
    
        // Set up HTTP server parameters
        mg_set_protocol_http_websocket(nc);
        s_http_server_opts.document_root = ".";  //文件相对路径 Serve current directory
        s_http_server_opts.enable_directory_listing = "yes";
    
        for (;;) {
            mg_mgr_poll(&mgr, 1000); //1s轮训一次
        }
        mg_mgr_free(&mgr);
    
        return true;
    }

    3.vs2019项目工程文件下载:vs2019_HttpSvr.zip

    以上。

  • 相关阅读:
    PointToPointNetDevice doesn't support TapBridgeHelper
    NS3系列—10———NS3 NodeContainer
    NS3系列—9———NS3 IP首部校验和
    NS3系列—8———NS3编译运行
    【习题 7-6 UVA
    【Good Bye 2017 C】 New Year and Curling
    【Good Bye 2017 B】 New Year and Buggy Bot
    【Good Bye 2017 A】New Year and Counting Cards
    【Educational Codeforces Round 35 D】Inversion Counting
    【Educational Codeforces Round 35 C】Two Cakes
  • 原文地址:https://www.cnblogs.com/chevin/p/11051867.html
Copyright © 2020-2023  润新知