分享一个嵌入式httpd服务器开发库 - boahttpd library

Boahttpd Library 是一个C接口的开发库,支持CGI、多线程和跨平台,适用于嵌入式设备的web管理。本文介绍了如何在Windows、Linux等平台上使用该库,包括创建简单的HTTP服务器、添加CGI支持和处理FORM请求。此外,还展示了如何实现过滤器和认证机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://sourceforge.net/projects/boahttpd/

    一个C接口的开发库,适用于 windows/linux/或其他嵌入式平台,支持CGI扩展,支持多线程。采用面向对象开发,一个应用里可以同时开多个http server,只要端口不同就互不影响。主要应用场景应该是嵌入式应用(所谓boa-server的概念),在需要做一个基本web的设备管理使用。在例子中就是展示,从页面信息的提交、到处理、到结果的返回,里面结合jquery/bootstrap网页技术,可以作出一个精致的设备管理控制页面。 

- Web file downloading 网页文件浏览
- CGI support , CGI支持
- Multi-thread, Multi-instance  多线程、多实例
- Cross-Platform (Windows, Linux, other Embedded Linux) 跨平台支持
- Filter & Authentication support  过滤器 / 鉴权密码认证
- Cookie support  , Cookie支持

     这个开发库体积较小,已经编译好了windows, linux(fedora14,x86)版本的库。使用起来就是一个头文件、一个库文件。比如说下面几句话就完成了一个简单的http服务器:

#include "../boahttpd.h"
int main()
{
    boa_server_t server;
    if(boa_server_create(&server, NULL,
          "wwwroot", 
           8888, "0.0.0.0") < 0)
    {
       printf("failed to create server!\n");
       return 0;
    } 

    getchar();
    boa_server_destroy(&server);
    return 0;
}

           其实就是一个简单的create操作,传入主目录文件夹的位置,端口号就可以了。在当前目录下创建一个wwwroot, 在wwwroot放一个index.html,运行程序试试吧。在浏览器里输入http://127.0.0.1:8888试着访问一下。
      上面是完成一个普通的http服务器,可以浏览下载网页了。但是若要支持cgi的处理,则需要注册一些回调函数。每个cgi服务有一个唯一的名称,并对应一个回调函数。当然,可以用一个回调函数来处理所有的cgi服务。示范代码如下:

static int cgi_handler(void* context, void* userdata)
{
    … handle the cgi request …
    return 0;
}
int main()
{
    boa_cgi_t cgi ;
    boa_cgi_create(&cgi);
    boa_cgi_register(&cgi, "test", &cgi_handler, NULL);
 
    boa_server_t server;
    if(boa_server_create(&server,&cgi,
            wwwroot", 8888, "0.0.0.0") < 0)
    {
       printf("failed to create server!\n");
       return 0;
    }
     getchar();

    boa_cgi_destroy(&cgi);
    boa_server_destroy(&server);
    return 0;
}

         上面是先定义若干个handler(即callback),然后把这些handler都添加一个boa_cgi_t对象里,然后把这个boa_cgi_t对象交给server即可。在运行的时候,server在接收到cgi请求后,会根据cgi服务的名称、找到相应的handler来处理。
          比如,输入cgi请求: http://127.0.0.1:8888/cgi/test?name=someone
          server收到此cgi请求后,检查到服务名称为test,于是检查boa_cgi_t里有没有注册了名称为"test"的handler,如果有的话就调用之。在handler里,可以获取cgi请求的相关信息,例如参数"name=someone"、以及HTTP头部的其他field字段。如果是个POST请求,可以获得正文。

static int cgi_handler(void* context, void* userdata)
{
    const char* service = boa_cgi_name(context);
    const char* method = boa_cgi_method(context);
    const char* argument = boa_cgi_args(context);
    const char* content = boa_cgi_content(context);
    const char* anyfield = boa_cgi_field(context,”Content-Length”);
      int sock = boa_cgi_socket(context);
}

NanoHTTPD一个免费、轻量级的(只有一个Java文件) HTTP服务器,可以很好地嵌入到Java程序中。支持 GET, POST, PUT, HEAD 和 DELETE 请求,支持文件上传,占用内存很小。可轻松定制临时文件使用和线程模型。NanoHTTPD for JDK 1.1https://github.com/NanoHttpd/nanohttpd/tree/nanohttpd-for-java1.1示例代码:package fi.iki.elonen.debug;   import fi.iki.elonen.NanoHTTPD; import fi.iki.elonen.ServerRunner;   import java.util.HashMap; import java.util.List; import java.util.Map;   public class DebugServer extends NanoHTTPD {     public DebugServer() {         super(8080);     }       public static void main(String[] args) {         ServerRunner.run(DebugServer.class);     }       @Override public Response serve(IHTTPSession session) {         Map<String, List<String>> decodedQueryParameters =             decodeParameters(session.getQueryParameterString());           StringBuilder sb = new StringBuilder();         sb.append("<html>");         sb.append("<head><title>Debug Server</title></head>");         sb.append("<body>");         sb.append("<h1>Debug Server</h1>");           sb.append("<p><blockquote><b>URI</b> = ").append(             String.valueOf(session.getUri())).append("<br />");           sb.append("<b>Method</b> = ").append(             String.valueOf(session.getMethod())).append("</blockquote></p>");           sb.append("<h3>Headers</h3><p><blockquote>").             append(toString(session.getHeaders())).append("</blockquote></p>");           sb.append("<h3>Parms</h3><p><blockquote>").             append(toString(session.getParms())).append("</blockquote></p>");           sb.append("<h3>Parms (multi values?)</h3><p><blockquote>").             append(toString(decodedQueryParameters)).append("</blockquote></p>");           try {             Map<String, String> files = new HashMap<String, String>();             session.parseBody(files);             sb.append("<h3>Files</h3><p><blockquote>").                 append(toString(files)).append("</blockquote></p>");         } catch (Exception e) {             e.printStackTrace();         }           sb.append("</body>");         sb.append("</html>");         return new Response(sb.toString());     }       private String toString(Map<String, ? extends Object> map) {         if (map.size() == 0) {             return "";         }         return unsortedList(map);     }       private String unsortedList(Map<String, ? extends Object> map) {         StringBuilder sb = new StringBuilder();         sb.append("<ul>");         for (Map.Entry entry : map.entrySet()) {             listItem(sb, entry);         }         sb.append("</ul>");         return sb.toString();     }       private void listItem(StringBuilder sb, Map.Entry entry) {         sb.append("<li><code><b>").append(entry.getKey()).             append("</b> = ").append(entry.getValue()).append("</code></li>");     } } 标签:NanoHTTPD
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿发你好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值