GNU Libmicrohttpd


GNU libmicrohttpd是一个小型的C库很容易将HTTP服务器作为另一个应用程序的一部分运行。GNU Libmicrohttpd是自由软件,是GNU项目.区别于来自其他项目的GNU Libmicrohttpd是:

  • C库:快速且小
  • API简单、易表达且完全可重入
  • 实现符合HTTP 1.1
  • HTTP服务器可以侦听多个端口
  • 各种线程模式:运行于应用程序线程、内部线程、线程池和线程对连接
  • 三种不同的套接字轮询模式:select()、poll()和epoll
  • 最小化系统调用数以避免额外的用户/内核模式切换
  • 支持的平台包括GNU/Linux、FreeBSD、OpenBSD、NetBSD、Android、Darwin(macOS)、W32、OpenIndiana/Solaris和z/OS
  • 支持IPv6
  • 支持SHOUTcast
  • 支持POST数据的增量处理(可选)
  • 支持基本身份验证和摘要身份验证(可选)
  • 支持TLS(需要libgnutls,可选)
  • 二进制文件仅约32k(不支持TLS和其他可选功能)

GNU libmicrohttpd之所以启动,是因为作者需要一种简单的方法来添加与其他项目的并发HTTP服务器。现有备选方案要么是非自由的、不可重入的、独立的、糟糕的代码质量或其组合。如果是,请不要使用GNU libmicrohttpd寻找一个独立的HTTP服务器,还有许多其他项目已经提供了这种功能。然而,如果您希望能够从您的C或C++应用程序,请检查它。

正在下载libmicrohttpd数据库

源代码
图书馆微httpd可通过以下途径从主GNU FTP服务器获得HTTP(S)文件传输协议。也可以找到GNU镜像拜托使用镜子如果可能的话。
Debian.deb包
debian包可以从官方debian档案.libmicrohttpd的相应包包括libmicrohttpd数据库和发展libmicrohttpd-dev.
焦油包装
最新版本可在上找到GNU镜像.如果镜子不工作,您应该可以在主FTP服务器.

最新版本为libmicrohttpd-latest.tar.gz.

窗户
最新的Windows二进制文件是libmicrohttpd-latest-w32-bin.zip.

文档

除了此网页上的简要文档外,我们提供各种其他形式的文件:

微httpd。小时
这包括对大部分API的详细文件文档。
手动
Libmicrohttpd手册按原样在线提供大多数GNU软件的文档.您还可以找到有关图书馆微httpd通过运行信息库微httpdman libmicrohttpd,或者通过观察/usr/share/doc/libmicrohttpd/,/usr/local/doc/libmicrohttpd/,或系统上的类似目录。
辅导的
GNU Libmicrohttpd教程在PDF格式HTML格式格式。
兼容性
美国石油学会/美国石油学会兼容性报告比较最新GNU libmicrohttpd版本

邮件列表

Libmicrohttpd使用libmicrohttpd数据库邮件列表,讨论Libmicrohttpd,包括支持、开发和增强请求,以及错误报告。

关于的公告图书馆微httpd大多数其他GNU软件都是在信息-菜单(档案).

不应立即公开的安全报告可以直接发送至这个维护人员。如果对紧急问题没有回应,您可以向将军汇报安全邮件列表以获取建议。

参与进来

开发Libmicrohttpd,一般来说,GNU是一项志愿工作,你可以做出贡献。对于信息,请阅读如何帮助GNU如果你愿意想参与进来,加入讨论邮件是个好主意列表(见上文)。

开发
在中跟踪已知错误和打开的功能请求我们的错误追踪器.你需要注册一个记者帐户。请制作确保在下报告错误libmicrohttpd数据库而不是在任何其他项目下。
Git访问

您可以使用以下命令访问libmicrohttpd的当前开发版本

$git克隆https://git.gnunet.org/libmicrohttpd.git

我们的网站位于

$cvs-z3-d:p服务器:anonymous@cvs.savannah.gnu.org:/web/libmicrohttpd联合libmicrohttpd

简介

依赖关系
GNU Libmicrohttpd可以在没有任何依赖性的情况下使用;然而,需要TLS(HTTPS)支持库gnutls.此外,测试用例使用libcurl公司。一些扩展测试用例还使用zzuf公司索卡特(以模拟违反HTTP协议的客户端)。您可以编译和使用GNU Libmicrohttpd,不安装库gnutls,libcurl公司,zzuf公司索卡特.
一个最小的例子
在包括微httpd。小时标题,您可能需要包括定义大小_t,fd设置,套接字_t结构sockaddr数据类型和定义MHD_平台_H。否则,这个微httpd。小时标头将尝试包含自动设置适当的标头,这可能会导致更奇怪的情况平台。

以下是GNU/Linux的一个最小示例(包含在发行版中):

#包括<microhttpd.h>#包括<stdlib.h>#包括<string.h>#包括<stdio.h>#define PAGE“<html><head><title>libmicrohttpd演示</title>”\“</head><body>libmicrohttpd演示</body></html>”静态枚举MHD_Resultahc_echo(无效*cls,struct MHD_Connection*连接,const char*url,const-char*方法,const char*版本,const char*上传数据,size_t*上传数据大小,无效**ptr){静态int伪码;const char*page=cls;struct MHD_Response*响应;int ret;if(0!=strcmp(方法,“GET”))返回MHD_NO;/*意外的方法*/if(&dummy!=*ptr){/*第一次只有标题有效时,第一轮没有回应*/*ptr=&dummy;返回MHD_YES;}if(0!=*上传数据大小)返回MHD_NO;/*在GET中上传数据*/*ptr=空;/*清除上下文指针*/响应=MHD_create_response_from_buffer(strlen(page),(无效*)第页,MHD_RESPMEM_PERSISTENT);ret=MHD_queue_response(连接,MHD_HTTP_OK,响应);MHD_销毁响应(响应);返回ret;}int main(int argc,字符**argv){结构体MHD_Daemon*d;如果(argc!=2){printf(“%s端口\n”,argv[0]);返回1;}d=MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION,atoi(argv[1]),无效的,无效的,&ahc_ echo,第页,MHD_OPTION_END);如果(d==NULL)返回1;(无效)getc(标准输入);MHD_stop_daemon(d);返回0;}
线程模式
上面的示例使用最简单的线程模式,MHD_USE_THREAD_PER_连接.在此模式下,MHD启动一个线程在端口上侦听新连接,然后生成新的线程来处理每个连接。如果HTTP服务器几乎没有任何在连接之间共享的状态(没有同步问题!)并且可能需要执行阻塞操作(例如大量IO或运行代码)来处理个人连接。

第二种穿线模式,MHD_USE_SELECT_内部,使用只有一个线程来处理对端口的侦听和处理请求。如果为每个连接成本会很高。如果HTTP服务器能够快速生成响应,每个响应都没有太多计算开销连接,这种模式可以是一个很好的选择。请注意,MHD将仍然为自己启动一个线程-这样,主程序调用后可以继续其操作MHD_守护程序启动.当然,如果HTTP服务器需要与主应用程序中的共享状态,同步将必修的。如果代码中的这种同步提供了响应导致阻塞所有连接上的所有HTTP服务器操作将停止。如果响应数据(用于响应使用生成MHD_create_response_from_callback(MHD_create_response_from_callback)功能)不能总是立即提供。原因是生成响应的代码不应阻塞(因为这将阻塞所有其他连接),另一方面,如果响应数据不是立即可用,MHD将开始忙于等待。使用如果要阻止在回调,或最后一种模式(如果要使用更为事件驱动的带有一个大选择循环的模式。

第三种模式将线程池与这个MHD_USE_SELECT_内部模式,可以从中受益需要可伸缩性的实现。如前所述,默认情况下这种模式只使用一个线程。当与线程池选项结合使用时可以用多个线程处理多个连接。这个使用MHD_OPTION_THREAD_POOL_SIZE(MHD_选项_螺纹_尺寸); 任何大于1的值此选项将激活线程池的使用。与…对比这个MHD_USE_THREAD_PER_连接模式(其中每个线程处理且仅处理一个连接),池中的线程可以处理大量并发连接。使用MHD_USE_SELECT_内部与线程池结合使用通常是最具伸缩性(但也最难调试)的模式MHD的操作。

第四种线程模式(未给定特定标志时使用)使用没有线程。相反,主应用程序必须(定期)请求从MHD设置文件描述符,执行选择调用,然后调用MHD_运行.MHD_运行然后将处理HTTP请求正常返回。MHD_运行保证不会阻塞;但是,它的访问处理程序和响应处理回调调用可能会阻塞。如果单线程需要实现,特别是如果主应用程序已经使用select循环进行处理。如果应用程序是未准备好提供响应,它可以为在外部选择循环以唤醒并在数据就绪后继续–MHD将如果应用程序未能从写入集中取消列出套接字提供响应数据(这只在这种模式下发生)。

提供的测试用例包括使用每个线程模式。

生成响应
MHD提供各种功能来创建结构MHD_响应物体。响应由一组HTTP标头和一个(可能是空)主体。创建响应的三种主要方法是指定给定(固定大小)主体(MHD_创建响应_来自数据),通过提供函数类型MHD_内容阅读器回调它提供了根据需要或通过提供打开的文件描述符进行响应(MHD _创建_响应_来自_fd). 第一个响应构造对于小型网页尤其是静态网页来说非常有用适合记忆。第二种响应类型应用于响应最初不知道大小或响应可能太大了,无法放入内存。最后,使用文件描述符可以在Linux系统上使用发送文件请求文件传输。

通过调用使用响应MHD_队列响应它发送在指定的连接上返回到客户端的响应。一次创建后,可以多次使用响应对象。在内部,每个响应都使用一个引用计数器。答案是参考计数器达到零时释放。HTTP服务器应该呼叫MHD_销毁响应当响应对象不再需要,即服务器不会调用MHD_队列响应再次使用此响应对象。注意,这并不意味着响应将立即被销毁–可能会被销毁延迟到所有连接上的响应发送完成队列中有响应的。

排队响应
客户不应创建“100 CONTINUE”响应。MHD公司内部处理“100 CONTINUE”,仅允许客户端对每个连接的单个响应进行排队。此外,客户不得在完全接收请求之前将响应排队(除了在HTTP 1.1中拒绝PUT或POST操作的情况下)。如果客户端尝试将多个响应排队或尝试将反应早,MHD_队列响应将失败(并返回MHD_编号).

将至少调用相应URL的回调函数两次。第一次调用发生在服务器收到标题。客户端应该使用最后一个空隙**的参数存储会话的内部上下文。第一次呼叫回调函数主要用于这种类型的初始化内部访问检查。至少,回调函数应该“记住”,只有标题的第一个调用发生了。在第一次调用期间排队响应(对于给定的连接)应仅用于错误–如果客户端将在第一次呼叫中响应,“100 CONTINUE”响应将被禁止,则不会读取请求正文和连接将在发送响应后关闭。第一次通话后将使用上传数据调用回调函数。直到*上传数据大小为零,回调可能不会将响应,任何此类尝试都将失败。回调函数应该更新*上传数据大小以指示有多少字节处理。根据可用的缓冲区空间,增量可能需要处理上传。上传所有数据后已处理,MHD将用*上传数据大小为零。此时,回调应将“正常”响应排队。如果排队响应是不可能,回调可能会阻塞或不排队响应取决于所使用的线程模式。如果此时回调不会将响应排队,MHD将(最终)使连接超时或继续调用。

POST请求的解析
MHD包括一组用于解析和处理数据的三个函数在POST请求中接收到。这些函数允许增量解析POST数据的处理。只是整个POST的一小部分数据需要放入内存。因此,使用MHD的应用程序可以支持任意大小的POST请求。POST数据已处理通过向MHD提供在部分上调用的回调函数接收值的。POST解析器本身被重复调用只要有更多的输入字节可用。MHD支持这两个uri-和多部分/表单编码POST数据。
内存管理
应用程序可以确定MHD应使用的缓冲区大小用于处理HTTP请求和解析POST数据。这边,MHD用户可以权衡处理时间和内存利用率。应用程序可以限制MHD的总连接数接受,以及每个连接使用的内存总量。MHD将妥善处理所有记忆外情况(通过关闭连接并清除任何剩余状态)。
相关项目
使用libmicrohttpd的项目
如果您编写的应用程序使用libmicrohttpd,请让我们知道,这样我们就可以将您添加到列表中!
选择
如果您知道一个竞争的库可能更适合一些开发人员,请让我们知道,以便我们可以将其添加到列表中!

许可

图书馆微httpd是自由软件;您可以重新发布和/或在GNU(全球导航单元)LGPL v2.1版或在您的选项任何时候都可以版本。如果禁用HTTPS/TLS支持,也可以选择第二个许可证,这个电子商务许可证。如果您对许可有任何疑问,请联系这个维护人员.