项目地址
https://github.com/cesanta/mongoose
使用的编辑器
CLion
项目一
新建项目umtitled,项目目录如下: 其中mongoose.cpp,和mongoose.h都是我从https://github.com/cesanta/mongoose扒下来的。基本上引入这两个就行了
内容分别为:
mongoose.cpp【部分】
#include "../include/mongoose.h"
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_internal.h"
#endif
#ifndef CS_MONGOOSE_SRC_INTERNAL_H_
#define CS_MONGOOSE_SRC_INTERNAL_H_
#ifndef MBUF_REALLOC
#define MBUF_REALLOC MG_REALLOC
#endif
#ifndef MBUF_FREE
#define MBUF_FREE MG_FREE
#endif
#define MG_SET_PTRPTR(_ptr, _v) \
do { \
if (_ptr) *(_ptr) = _v; \
} while (0)
#ifndef MG_INTERNAL
#define MG_INTERNAL static
#endif
#ifdef PICOTCP
#define NO_LIBC
#define MG_DISABLE_PFS
#endif
#ifndef MG_CTL_MSG_MESSAGE_SIZE
#define MG_CTL_MSG_MESSAGE_SIZE 8192
#endif
MG_INTERNAL
struct mg_connection
*mg_do_connect(struct mg_connection
*nc
,
int proto
,
union socket_address
*sa
);
MG_INTERNAL
int mg_parse_address(const char *str
, union socket_address
*sa
,
int *proto
, char *host
, size_t host_len
);
MG_INTERNAL
void mg_call(struct mg_connection
*nc
,
mg_event_handler_t ev_handler
, void *user_data
, int ev
,
void *ev_data
);
void mg_forward(struct mg_connection
*from
, struct mg_connection
*to
);
MG_INTERNAL
void mg_add_conn(struct mg_mgr
*mgr
, struct mg_connection
*c
);
MG_INTERNAL
void mg_remove_conn(struct mg_connection
*c
);
MG_INTERNAL
struct mg_connection
*mg_create_connection(
struct mg_mgr
*mgr
, mg_event_handler_t callback
,
struct mg_add_sock_opts opts
);
#ifdef _WIN32
int to_wchar(const char *path
, wchar_t *wbuf
, size_t wbuf_len
);
#endif
struct ctl_msg
{
mg_event_handler_t callback
;
char message
[MG_CTL_MSG_MESSAGE_SIZE
];
};
#if MG_ENABLE_MQTT
struct mg_mqtt_message
;
#define MG_MQTT_ERROR_INCOMPLETE_MSG -1
#define MG_MQTT_ERROR_MALFORMED_MSG -2
MG_INTERNAL
int parse_mqtt(struct mbuf
*io
, struct mg_mqtt_message
*mm
);
#endif
extern void *(*test_malloc
)(size_t size
);
extern void *(*test_calloc
)(size_t count
, size_t size
);
#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#if MG_ENABLE_HTTP
struct mg_serve_http_opts
;
MG_INTERNAL
struct mg_http_proto_data
*mg_http_create_proto_data(
struct mg_connection
*c
);
***
mongoose.h【部分】
#ifdef MG_MODULE_LINES
#line 1 "mongoose/src/mg_common.h"
#endif
#ifndef CS_MONGOOSE_SRC_COMMON_H_
#define CS_MONGOOSE_SRC_COMMON_H_
#define MG_VERSION "6.18"
#ifdef MG_LOCALS
#include <mg_locals.h>
#endif
#endif
#ifdef MG_MODULE_LINES
#line 1 "common/platform.h"
#endif
#ifndef CS_COMMON_PLATFORM_H_
#define CS_COMMON_PLATFORM_H_
main.cpp
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <iostream>
#include "include/mongoose.h"
static const char *s_http_port
= "8000";
static struct mg_serve_http_opts s_http_server_opts
;
static void handle_sum_call(struct mg_connection
*nc
, struct http_message
*hm
) {
char n1
[100], n2
[100];
double result
;
mg_get_http_var(&hm
->body
, "n1", n1
, sizeof(n1
));
mg_get_http_var(&hm
->body
, "n2", n2
, sizeof(n2
));
mg_printf(nc
, "%s", "HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n");
result
= strtod(n1
, NULL) + strtod(n2
, NULL);
mg_printf_http_chunk(nc
, "{ \"result\": %lf }", result
);
mg_send_http_chunk(nc
, "", 0);
}
static void ev_handler(struct mg_connection
*nc
, int ev
, void *ev_data
) {
struct http_message
*hm
= (struct http_message
*) ev_data
;
switch (ev
) {
case MG_EV_HTTP_REQUEST
:
if (mg_vcmp(&hm
->uri
, "/api/v1/sum") == 0) {
handle_sum_call(nc
, hm
);
} else if (mg_vcmp(&hm
->uri
, "/printcontent") == 0) {
printf("-------------------------------%zu", hm
->body
.len
);
char buf
[100] = {0};
memcpy(buf
, hm
->body
.p
,
sizeof(buf
) - 1 < hm
->body
.len
? sizeof(buf
) - 1 : hm
->body
.len
);
printf("aaaaaaaaaaaaaaaaaaaaaaaa%s\n", buf
);
} else {
mg_serve_http(nc
, hm
, s_http_server_opts
);
}
break;
default:
break;
}
}
int main(int argc
, char *argv
[]) {
struct mg_mgr mgr
;
struct mg_connection
*nc
;
struct mg_bind_opts bind_opts
;
int i
;
char *cp
;
const char *err_str
;
#if MG_ENABLE_SSL
const char *ssl_cert
= NULL;
#endif
mg_mgr_init(&mgr
, NULL);
if (argc
> 0 && ((cp
= strrchr(argv
[0], DIRSEP
)) != NULL)) {
*cp
= '\0';
s_http_server_opts
.document_root
= argv
[0];
}
for (i
= 1; i
< argc
; i
++) {
if (strcmp(argv
[i
], "-D") == 0 && i
+ 1 < argc
) {
mgr
.hexdump_file
= argv
[++i
];
} else if (strcmp(argv
[i
], "-d") == 0 && i
+ 1 < argc
) {
s_http_server_opts
.document_root
= argv
[++i
];
} else if (strcmp(argv
[i
], "-p") == 0 && i
+ 1 < argc
) {
s_http_port
= argv
[++i
];
} else if (strcmp(argv
[i
], "-a") == 0 && i
+ 1 < argc
) {
s_http_server_opts
.auth_domain
= argv
[++i
];
} else if (strcmp(argv
[i
], "-P") == 0 && i
+ 1 < argc
) {
s_http_server_opts
.global_auth_file
= argv
[++i
];
} else if (strcmp(argv
[i
], "-A") == 0 && i
+ 1 < argc
) {
s_http_server_opts
.per_directory_auth_file
= argv
[++i
];
} else if (strcmp(argv
[i
], "-r") == 0 && i
+ 1 < argc
) {
s_http_server_opts
.url_rewrites
= argv
[++i
];
#if MG_ENABLE_HTTP_CGI
} else if (strcmp(argv
[i
], "-i") == 0 && i
+ 1 < argc
) {
s_http_server_opts
.cgi_interpreter
= argv
[++i
];
#endif
#if MG_ENABLE_SSL
} else if (strcmp(argv
[i
], "-s") == 0 && i
+ 1 < argc
) {
ssl_cert
= argv
[++i
];
#endif
} else {
fprintf(stderr, "Unknown option: [%s]\n", argv
[i
]);
exit(1);
}
}
memset(&bind_opts
, 0, sizeof(bind_opts
));
bind_opts
.error_string
= &err_str
;
#if MG_ENABLE_SSL
if (ssl_cert
!= NULL) {
bind_opts
.ssl_cert
= ssl_cert
;
}
#endif
nc
= mg_bind_opt(&mgr
, s_http_port
, ev_handler
, bind_opts
);
if (nc
== NULL) {
fprintf(stderr, "Error starting server on port %s: %s\n", s_http_port
,
*bind_opts
.error_string
);
exit(1);
}
mg_set_protocol_http_websocket(nc
);
s_http_server_opts
.enable_directory_listing
= "yes";
printf("Starting RESTful server on port %s, serving %s\n", s_http_port
,
s_http_server_opts
.document_root
);
for (;;) {
mg_mgr_poll(&mgr
, 1000);
}
mg_mgr_free(&mgr
);
return 0;
}
CMakeLists.txt
cmake_minimum_required
(VERSION 3.16
)
project
(untitled
)
set
(CMAKE_CXX_STANDARD 11
)
add_executable
(untitled main.cpp mongoose.cpp
)
编译&运行
在CMakeLists.txt同级目录下执行命令:cmake .,make 发现生成一个untiled,执行命令:./untitiled
测试请求