使用Libmicrohttpd搭建内嵌(本地)服务器的方法

Libmicrohttpd简介

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

C语言库,小而快。

API非常简单,且都是可重入的。

兼容HTTP1.1。

支持4种多线程模型(select、poll、pthread、thread poll)。

跨平台。

生成的二制文件只有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:

MHD_USE_INTERNAL_POLpNG_THREAD。这个参数与其他两个参数(MHD_USE_POLL_INTERNAL_THREAD、MHD_USE_EPOLL_INTERNAL_THREAD)一起构成了microhttpd支持的三种模式:select、poll、epoll。用户必须选择这三种模式之一。具体信息见源码。

port。端口号。

connectHandler。处理请求的函数。

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搭建内嵌(本地)服务器的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 使用Libmicrohttpd搭建内嵌(本地)服务器的方法

    Libmicrohttpd简介 GNU Libmicrohttpd是一个用来在项目中内嵌http服务器的C语言库,它具有以下几个非常鲜明的特点: C语言库,小而快. API非常简单,且都是可重入的. 兼容HTTP1.1. 支持4种多线程模型(select.poll.pthread.thread poll). 跨平台. 生成的二制文件只有32K(不包含TLS/SSL等额外功能). 搭建一个简单的本地静态服务器 这篇文章里,我们只编写一个简单的静态服务器,对于用户的所有请求我们都只返回同一个html

  • CentOS平台实现搭建rsync远程同步服务器的方法

    本文实例讲述了CentOS平台实现搭建rsync远程同步服务器的方法.分享给大家供大家参考,具体如下: rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 rsync 同步本地硬盘中的不同目录. rsync和scp的区别: rsync支持增量同步,不管是文件数量的新增还是文件内容的新增,scp不行 注意事项: 1.centos默认已经安装rsync了,输入命令rsync查看,如果无法正常工作可参考文章最后的链接进行操

  • C#实现在Form里面内嵌dos窗体的方法

    本文实例讲述了C#实现在Form里面内嵌dos窗体的方法.分享给大家供大家参考.具体如下: using System; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnostics; namespace cmdForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

  • JS动态修改iframe内嵌网页地址的方法

    本文实例讲述了JS动态修改iframe内嵌网页地址的方法.分享给大家供大家参考.具体分析如下: 下面的JS代码通过修改iframe的src属性动态修改iframe的内嵌网页 <!DOCTYPE html> <html> <head> <script> function changeSrc() { document.getElementById("myframe").src="http://google.com"; }

  • php 替换文章中的图片路径,下载图片到本地服务器的方法

    php 替换文章中的图片路径,下载图片到本地服务器 /** * 获取替换文章中的图片路径 * @param string $xstr 内容 * @param string $oriweb 网址 * @return string * */ function replaceimg($xstr, $oriweb){ //保存路径 $d = date('Ymd', time()); $saveimgfile_1 = '/uploads/allimg/'.$d; $dirslsitss = DEDEROO

  • spring boot中内嵌redis的使用方法示例

    redis介绍 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库.可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景. 引言 对于单元测试来说,我们应该让它尽量保持单一环境,不要与网络资源相通讯,这样可以保证测试的稳定性与客观性,对于springboot这个框架来说,它集成了单元测试JUN

  • PHP5.4起内置web服务器使用方法

    PHP是一种脚本语言,它需要PHP解释器来分析运行PHP文件.当把PHP做为CGI服务Web请求时,它需要被嵌入到某种Web服务器里,最常见的是集成到Apache或IIS里,这就是说,在使用PHP前,你需要安装Apache或IIS,并且正确的配置它们和PHP集成的参数.虽然这种配置已经很规范,文档非常丰富,但我们还是经常在安装Apache和PHP集成时遇到问题,而且,有时候我们只想测试一个简单的PHP特征,不想就为此安装.启动Apache服务. 但据官方文档上说,这个内置的Web服务器只是提供开

  • 用nginx搭建简单的文件下载服务器的方法

    1.修改nginx.conf配置文件,内容如下: server { listen 9000; #端口 server_name localhost; #服务名 charset utf-8; # 避免中文乱码 root E:\Download\java; #显示的根索引目录,注意这里要改成你自己的,目录要存在 location / { autoindex on; #开启索引功能 autoindex_exact_size off; # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb.

  • 利用nodeJs anywhere搭建本地服务器环境的方法

    公司有个微信端项目,需要前端在手机上随时查看网页,于是乎用Node搭建了一个本地服务器环境,把网页地址发到QQ并用手机打开来查看. 首先去nodeJs官网下载最新版nodeJs https://nodejs.org/en/ 安装成功后win+r打开cmd 输入node -help 或者node -v查看是否安装成功 装好后输入 npm install anywhere -g来安装anywhere.注意如果是mac系统会提示你权限不够,需要在代码前加上 sudo获取管理员权限.即sudo npm

  • 使用SpringBoot内置web服务器

    目录 一.SpringBoot默认web服务器? 二.如何配置当前web容器? 三.内嵌Web服务器如何切换(从tomcat到jetty)? 四.Web容器怎么自动配置? 五.web容器启动源码解析? 六.SpringBoot内置服务器不使用SPI机制特别说明? 本文介绍SpringBoot内置web服务器.知识点有SpringBoot默认web服务器:如何配置当前web容器:内嵌Web服务器如何切换(从tomcat到jetty):Web容器怎么自动配置:web容器启动源码解析:SpringBo

随机推荐