利用mongoose实现一个简易的web服务器

main.cpp:

#include <iostream>
#include <fstream>
#include <sstream>
#include "mongoose.h"

using namespace std;

static void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data)
{

  if (ev == MG_EV_HTTP_MSG)
  {
    char buf[1024] = {0};

    struct mg_http_message *hm = (struct mg_http_message *)ev_data;
    if (mg_http_match_uri(hm, "/login"))
    {
      //  解析get请求
      printf("hm->query: %.*s\n", (int)hm->query.len, hm->query.ptr);
      mg_http_get_var(&hm->query, "password", buf, sizeof(buf));
      cout << "password: " << buf << endl;
      if (strcmp(buf, "88888888") == 0)
      {
        mg_http_reply(c, 200, "Content-Type: application/json\r\n", "{\"result\": %d}", 0);
      }
      else
      {
        mg_http_reply(c, 200, "Content-Type: application/json\r\n", "{\"result\": %d}", -1);
      }
    }
    else if (mg_http_match_uri(hm, "/content"))
    {
      //  解析post请求
      printf("hm->body: %.*s\n", (int)hm->body.len, hm->body.ptr);
      char *str = mg_json_get_str(hm->body, "$.content"); // 解析json数据
      cout << "content: " << str << endl;
      free(str);
      mg_http_reply(c, 200, "Content-Type: application/json\r\n", "{\"result\": %d}", 0);
    }
    else
    {
      // 设置服务器根目录
      struct mg_http_serve_opts opts = {.root_dir = "/home/dinstech/temp-work/http-server/web"};
      mg_http_serve_dir(c, hm, &opts);
    }
  }
}

int main()
{
  struct mg_mgr mgr;

  mg_mgr_init(&mgr);
  mg_http_listen(&mgr, "http://0.0.0.0:8000", fn, NULL);
  for (;;)
    mg_mgr_poll(&mgr, 1000);

  return 0;
}

web测试页面代码,通过 mg_http_serve_dir() 函数设置根目录后,第一个页面直接命名为index.html ,当在浏览器中直接输入 IP:端口(192.168.3.220:8000) 时,可以直接显示第一个页面。

index.html:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <title>登录</title>
  <link rel="stylesheet" href="./layui/css/layui.css">
</head>

<style>
  .layui-form {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
  }

  .layui-input {
    border-radius: 5px;
  }

  .layui-btn {
    border-radius: 5px;
    margin-left: 0px;
  }
</style>

<body>

  <form class="layui-form" action="">
    <div class="layui-form-item">
      <label class="layui-form-label">密码</label>
      <div class="layui-input-inline">
        <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off"
          class="layui-input" lay-reqText="密码不能为空">
      </div>
    </div>
    <div class="layui-form-item">
      <div class="layui-input-inline">
        <button class="layui-btn" lay-submit lay-filter="login-button">登录</button>
      </div>
    </div>
  </form>

</body>

<script src="./layui/layui.js"></script>
<script>
  function httpGet(url) {
    return fetch(url)
      .then(function (response) {
        if (response.ok) {
          console.log('#################');
          return response.json();
        } else {
          console.log('Request failed');
          throw new Error('Request failed');
        }
      })
      .catch(function (error) {
        console.error(error);
      });
  }

  //Demo
  layui.use('form', function () {
    var form = layui.form;

    //监听提交
    form.on('submit(login-button)', function (data) {
      var params = new URLSearchParams(); // 创建URLSearchParams对象
      // 遍历data.field,将每个键值对添加到URLSearchParams对象中
      for (var key in data.field) {
        var value = data.field[key];
        params.append(key, value);
      }
      var queryString = params.toString(); // 将URLSearchParams对象转换为查询字符串
      var reqData = '/login?' + queryString; // 拼接查询字符串到请求URL
      console.log(reqData);
      httpGet(reqData)
        .then(function (response) {
          console.log(response);
          if(response.result == 0)
          {
            window.location.href = 'main.html';
          }
          else
          {
            layer.msg('密码错误');
          }
        });

      return false;
    });

  });
</script>

</html>

main.html:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>主页面</title>
    <link rel="stylesheet" href="./layui/css/layui.css">
</head>

<style>
    .layui-form {
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100vh;
    }

    .layui-input {
        border-radius: 5px;
    }

    .layui-btn {
        border-radius: 5px;
        margin-left: 0px;
    }
</style>

<body>

    <form class="layui-form" action="">
        <div class="layui-form-item">
            <label class="layui-form-label">输入框</label>
            <div class="layui-input-inline">
                <input type="content" name="content" required lay-verify="required" placeholder="请输入内容"
                    autocomplete="off" class="layui-input" lay-reqText="内容不能为空">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-inline">
                <button class="layui-btn" lay-submit lay-filter="login-button">确认</button>
            </div>
        </div>
    </form>

</body>

<script src="./layui/layui.js"></script>
<script>

    function httpPost(url, data) {
        return fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(data)
        })
            .then(function (response) {
                if (response.ok) {
                    console.log('#################');
                    return response.json();
                } else {
                    console.log('Request failed');
                    throw new Error('Request failed');
                }
            })
            .catch(function (error) {
                console.error(error);
            });
    }


    //Demo
    layui.use('form', function () {
        var form = layui.form;

        //监听提交
        form.on('submit(login-button)', function (data) {
            console.log(data.field);
            httpPost("/content", data.field)
                .then(function (response) {
                    if (response.result == 0) {
                        layer.msg('提交成功');
                    }
                    else {
                        layer.msg('提交失败');
                    }
                });

            return false;
        });

    });
</script>

</html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: mongoose一个基于C语言编写的高性能的多线程HTTP服务器。它可以通过设置多个监听端口来实现多端口的HTTP服务器。 在mongoose中,可以通过调用`mg_bind()`函数指定要监听的多个端口。这个函数接受一个指向`struct mg_connection`的指针,该结构体包含了服务器相关的信息,如IP地址、端口号等。通过对这个结构体进行配置,可以实现多端口监听。 具体实现步骤如下: 1. 创建一个`struct mg_mgr`结构体对象,用于管理Mongoose实例和连接。 2. 调用`mg_mgr_init()`函数初始化`struct mg_mgr`对象。 3. 调用`mg_bind()`函数,传入要监听的端口号,与之前创建的`struct mg_connection`对象关联。 4. 调用`mg_set_protocol_http_websocket()`函数,将协议设置为HTTP。 5. 调用`mg_mgr_poll()`函数,开始监听端口并处理请求。 下面是一个简单的示例代码: ```c #include "mongoose.h" int main() { struct mg_mgr mgr; struct mg_connection *conn; mg_mgr_init(&mgr); // 创建一个结构体,用于保存服务器相关的信息 conn = mg_bind(&mgr, "8080", NULL); // 添加其他需要监听的端口 mg_bind(&mgr, "8081", NULL); mg_bind(&mgr, "8082", NULL); mg_set_protocol_http_websocket(conn); for (;;) { mg_mgr_poll(&mgr, 1000); } mg_mgr_free(&mgr); return 0; } ``` 通过上述代码,我们就可以在8080、8081和8082等多个端口上启动监听HTTP请求的服务器。 总结来说,mongoose可以通过设置多个监听端口来实现多端口HTTP服务器。通过创建多个`struct mg_connection`对象,并绑定到不同的端口,就可以实现在多个端口上同时监听HTTP请求。 ### 回答2: Mongoose一个轻量级的嵌入式Web服务器软件,它可以实现多端口的HTTP服务器,具有简单易用、灵活可配置的特点。 要实现多端口的HTTP服务器,我们需要先创建一个Mongoose实例,然后配置不同端口的监听。 首先,我们创建Mongoose实例: ```cpp mg_mgr_init(&mgr, NULL); ``` 然后,我们按照需要配置不同端口的监听。假设我们要监听两个端口,分别为8000和9000,我们可以这样配置: ```cpp struct mg_connection *conn1 = mg_bind(&mgr, "8000", ev_handler); struct mg_connection *conn2 = mg_bind(&mgr, "9000", ev_handler); ``` 其中,ev_handler是处理事件的函数。 接下来,我们需要进入一个循环,以便Mongoose能够监听并处理客户端请求: ```cpp while (true) { mg_mgr_poll(&mgr, 1000); } ``` 在处理事件的函数中,我们可以根据具体的需求进行处理。例如,当有客户端连接时,我们可以向客户端发送欢迎信息: ```cpp static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { if (ev == MG_EV_ACCEPT) { mg_printf(nc, "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, World!"); nc->flags |= MG_F_SEND_AND_CLOSE; } } ``` 通过以上步骤,我们就可以实现多端口的HTTP服务器了。我们可以根据实际需求配置不同的端口和处理逻辑,以满足多样化的应用场景。同样的,我们也可以使用其他编程语言来使用Mongoose实现多端口的HTTP服务器。 ### 回答3: Mongoose一个嵌入式Web服务器,它可以帮助我们实现多端口的HTTP服务器Mongoose具有非常灵活的配置选项,可以轻松地配置多个端口。 要实现多端口的HTTP服务器,我们需要首先在代码中导入Mongoose库,并创建一个Mongoose实例。然后,我们可以使用`mg_bind()`函数将多个端口绑定到Mongoose实例上。 例如,下面的代码片段展示了如何使用Mongoose实现多端口的HTTP服务器: ```c #include "mongoose.h" int main() { struct mg_mgr mgr; struct mg_connection *nc; const char *ports[] = {"8080", "8888", NULL}; // 定义需要监听的端口 mg_mgr_init(&mgr, NULL); // 循环遍历端口列表,绑定每个端口到Mongoose实例 for (int i = 0; ports[i] != NULL; i++) { nc = mg_bind(&mgr, ports[i], ev_handler); if (nc == NULL) { printf("Failed to bind to port %s\n", ports[i]); continue; } mg_set_protocol_http_websocket(nc); } printf("Mongoose HTTP server started on ports %s\n", ports); while (1) { mg_mgr_poll(&mgr, 1000); } mg_mgr_free(&mgr); return 0; } // 处理请求的回调函数 void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { // 在这里处理HTTP请求 } ``` 上述代码中,我们首先定义了需要监听的端口列表,包括8080和8888两个端口。然后,通过循环遍历端口列表,在Mongoose实例中绑定每个端口。如果绑定失败,则会打印错误信息。接着,设置协议为HTTP,并进入循环以等待来自客户端的请求。 在回调函数`ev_handler`中,我们可以根据需要来处理HTTP请求。可以处理GET、POST等不同类型的请求,并根据请求内容返回相应的响应。 通过使用Mongoose,我们可以轻松实现多端口的HTTP服务器。无论是需要同时监听多个端口,还是在不同的端口上提供不同的服务,Mongoose都是一个非常便捷和可靠的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值