注1:选择5.1版本进行分析是因为我参与的项目中使用的就是5.1版本,而且个人理解这一版本的代码结构比较有序,功能也不是太复杂。当然后续会继续分析5.2,5.3以及最新的代码。
注2:在分析的过程中,为了简化代码和逻辑,我打开了下述编译宏以关闭对应的功能:
NO_CGI,NO_WEBSOCKET,NO_DIRECTORY_LISTING,NO_DAV,NO_AUTH,NO_LOGGING
注3:有一个gcc自带的工具cpp,非常便于对原始代码进行预处理。对于我这样不喜欢#if和#ifdef之类的编译宏,在阅读代码时有很大的帮助。我使用的cpp预处理命令如下:
cpp -DNO_CGI -DNO_WEBSOCKET -DNO_DIRECTORY_LISTING -DNO_DAV -DNO_AUTH -DNO_LOGGING -fdirectives-only -nostdinc -undef ../mongoose.c > ../mongoose.i
一个简单的mg_server的使用过程如下
1. 创建一个mg_server,参数可以为空,也可以传递一个自定义的数据
server = mg_create_server(NULL);
2. 配置mg_server
mg_set_option(server, "listening_port", "8080");
mg_add_uri_handler(server, "/", index_html);
3. 进入for循环,轮询mg_sever,超时时间为1000ms,即1s
for (;;) {
mg_poll_server(server, 1000);
}
mg_poll_server(server, 1000);
}