Libmicrohttpd简介

GNU Libmicrohttpd是一个用来在项目中内嵌http服务器的C语言库,它具有以下几个非常鲜明的特点:

  1. C语言库,小而快。
  2. API非常简单,且都是可重入的。
  3. 兼容HTTP1.1。
  4. 支持4种多线程模型(select、poll、pthread、thread poll)。
  5. 跨平台。
  6. 生成的二制文件只有32K(不包含TLS/SSL等额外功能)。

搭建一个简单的本地静态服务器

这篇文章里,我们只编写一个简单的静态服务器,对于用户的所有请求我们都只返回同一个html页面, 该页面显示一串字符。

1. 下载Libmicrohttpd,编译后添加进VS项目

为了使用Libmicrohttpd,我们需要将其添加进VS项目中。这里我们选择编译源代码生成静态库,因为官方给的下载静态库版本链接在使用时会有问题,可能是运行库版本不一致; 并且在使用静态库的情况下,我们只需要引用两个文件就可以了(一个头文件、一个库文件),项目结构不会混乱不清。

实际上Libmicrohttpd的源码编译非常简单,它提供了VS编译文件,基本上我们只需要进入w32目录,在该目录下选择合适的VS子目录下的sln文件,双击打开就可以了。打开后,修改设置libmicrohttpd项目为静态库项目(记得修改生成文件的后缀名,因为默认是dll),右击生成就可以编译成功了。

生成的文件包括一个头文件和一个静态库文件,新建一个VS控制台项目,并将它们添加到VS项目中。

2. main函数

main函数非常简单,核心调用只有2个函数:MHD_start_daemonMHD_stop_daemon,分别开始和停止http服务器。

int main()
{
const int port = 8888; struct MHD_Daemon* daemon =
MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, port
, NULL, NULL, connectionHandler, NULL, MHD_OPTION_END);
if (daemon == NULL) {
std::cout << "cannot start server!\n";
return -1;
} std::cin.get();
MHD_stop_daemon(daemon);
return 0;
}

MHD_start_daemon函数包含非常多的参数,这也意味着它集成了很多的功能,这里我们只关注四个参数,其它都为NULL:

  1. MHD_USE_INTERNAL_POLLING_THREAD。这个参数与其他两个参数(MHD_USE_POLL_INTERNAL_THREAD、MHD_USE_EPOLL_INTERNAL_THREAD)一起构成了microhttpd支持的三种模式:select、poll、epoll。用户必须选择这三种模式之一。具体信息见源码。
  2. port。端口号。
  3. connectHandler。处理请求的函数。
  4. MHD_OPTION_END。由于MHD_start_daemon最后一个参数是一个变参,因此MHD_OPTION_END用来表示变参终止。

MHD_stop_daemon函数比较简单,这里不介绍了。

3 请求处理函数

所有的请求处理都发生在connectionHandler中:

int  connectionHandler(
void *cls,
struct MHD_Connection *connection,
const char *url,
const char *method,
const char *version,
const char *upload_data,
size_t *upload_data_size,
void **con_cls)
{
const char* pageBuffer = "<html><body>Hello, I'm lgxZJ!</body></html>"; struct MHD_Response *response;
response = MHD_create_response_from_buffer(strlen(pageBuffer),
(void*)pageBuffer, MHD_RESPMEM_PERSISTENT); if (MHD_add_response_header(response, "Content-Type", "text/html") == MHD_NO) {
std::cout << "MHD_add_response_header error\n";
return MHD_NO;
}
if (MHD_queue_response(connection, MHD_HTTP_OK, response) == MHD_NO) {
std::cout << "MHD_queue_response error\n";
return MHD_NO;
}
MHD_destroy_response(response); return MHD_YES;
}

这个函数签名包含了所有用来处理请求的有用信息,这里不逐一介绍了。microhttpd库提供了函数来方便我们响应请求,这里我们重点看创建响应。microhttpd库提供了两种方法来创建请求:从buffer创建从文件创建。但是后者需要传入一个文件描述符,这在windows上不是很方便。

我们这里用缓冲创建。需要注意的是最后一个参数,这是一个MHD_ResponseMemoryMode枚举值,表示我们使用的buffer内容是固定不变的。这种枚举类型还包含其他2种代表瞬时缓冲类型的值,分别表示缓冲区是在heap上的,和非heap(例如stack)上的。 用不同的缓冲区时要记得用不同的枚举值。 接下来设置MIME类型,把缓冲入队,并释放MHD_Response结构体。对于正确响应,我们返回MHD_YES;不能响应的,我们返回MHD_NO。

运行程序,我们打开浏览器并输入127.0.0.1:8888,得到如下结果:

还能做更多

  • MHD_start_daemon函数还可以限制特定ip的访问。
  • 请求处理函数还包含请求方法请求数据
  • 我们还可以挂起、恢复连接
  • ......

使用Libmicrohttpd搭建内嵌(本地)服务器的更多相关文章

  1. 本地windows下搭建git的本地服务器

    本地windows下搭建git的本地服务器 准备工作: 本地安装java环境,配置环境变量(略) 下载gitblit文件,百度一大堆 开始第一步: 减压gitblit压缩包到某个目录下,比如我在:H: ...

  2. Spring Boot 揭秘与实战(五) 服务器篇 - 内嵌的服务器 Tomcat剖析

    文章目录 1. 内嵌的 Tomcat,一个Jar包运行 2. 如何定制内嵌 Tomcat3. War 包部署的使用细节 2.1. 设置内嵌Tomcat的端口 2.2. 设置内嵌Tomcat的最大线程数 ...

  3. Apache James搭建内网邮件服务器

    Apache James搭建内网邮件服务器 极客521 | 极客521 2014-08-21 148 阅读 java 大概之前两个礼拜的日子,讨论会介绍了关于了.net内网邮件服务器的搭建.所以自己也 ...

  4. Git-gitblit-Tortoisegit 搭建Windows Git本地服务器

    1.Gitblit安装 1.1.Gitblit简介 Git在版本控制领域可谓是深受程序员喜爱.对于开源的项目,可以免费托管到GitHub上面,相当的方便.但是私有项目托管到GitHub会收取相当昂贵的 ...

  5. 使用ActiveMQ 传输文件 以及使用Jetty搭建内嵌文件服务器

    使用Active发送文件 ActiveMq 本身提供对于传输文件的支持. 1. 直接传输文件: 使用connection.createOutputStream 的形式.这种方式适合小文件.不能传输大文 ...

  6. bind搭建内网DNS服务器架构(主从、子域授权、DNS转发器)

    实验目的 模拟企业DNS服务架构服务器及原理 实验环境准备 实验架构图 实验设备 DNS服务器4台 主服务器master(centos8):IP_192.168.100.30, 从服务器slave(r ...

  7. 【日记】搭建一个node本地服务器

    用node搭建一个本地http服务器.首先了解htpp服务器原理 HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型 ...

  8. node搭建简单的本地服务器

    首先要安装node,方法很多,可以去网上找找,可以直接去官网下载安装,新版本的node是自带npm的: 安装好以后,新建一个js文件,名为server.js: let http = require(' ...

  9. 使用 Apache James 3.3.0(开源免费) 搭建内网电子邮件服务器(基于 Windows + Amazon Corretto 8)

    电子邮件服务器,对于很多公司,都是需要的. 虽然现在很多人,使用 QQ .微信进行一对一的工作沟通,使用QQ 群.微信群进行多人沟通,但这些即时聊天工具,与电子邮件相比,仍有很多不足: a. 电子邮件 ...

随机推荐

  1. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  2. Python 学习之路2

    这是我在大学上机实验的作业 实验一 将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 首先,先谈下我的设计思路: 设计思路: 1.    先需判断输入的number是不是一个数字( ...

  3. 通过ELK快速搭建一个你可能需要的集中化日志平台

    在项目初期的时候,大家都是赶着上线,一般来说对日志没有过多的考虑,当然日志量也不大,所以用log4net就够了,随着应用的越来越多,日志散 落在各个服务器的logs文件夹下,确实有点不大方便,这个时候 ...

  4. 自学HTML5难 我们应该怎么做

    互联网发展到今天,越来越多的技术岗位人才出现了稀缺的状态,就拿当前的HTML5来讲,基本成为了每家互联网公司不可缺少的人才.如果抓住这个机会,把HTML5搞好,那么前途不可限量,而且这门行业是越老越吃 ...

  5. 企业级监控zabbix基础

    一个标准的监控系统所具备的基本功能: 1.数据的采集 2.为了展示其长期走势,将数据存储下来 3.万一某次采样的结果不在被认为是合理的范围内,然后就会做出告警操作,尽早的让相关人员得知到此消息 4.展 ...

  6. Python——Scrapy初学

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.Scrapy最初是为了页面抓取(更确切来说, 网络抓取)所设计的,也 ...

  7. HDU5410--01背包+完全背包

    CRB and His Birthday Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  8. php的过滤器功能

    1.简介 PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入. 1.1 外部数据: 来自表单的输入数据 Cookies Web services data 服务器变量 数据库查询结果 1 ...

  9. 关于前端框架BootStrap和JQueryUI(以及相应的优秀模板)

    近期两个月因为须要升级公司产品的界面.所以不得不去学习了下原本并不熟悉的前端框架. 这里也是推荐两款BootStrap和JQueryUI. bootstrap使用起始非常easy,首先.须要得到所须要 ...

  10. 用KMP算法实现strStr()

    strStr()函数的用途是在一个字符串S中寻找某个字串P第一次出现的位置.并返回其下标,找不到时返回-1.最简单的办法就是找出S全部的子串和P进行比較,然而这种方法比較低效.假设我们从S的下标0和P ...