代码之家  ›  专栏  ›  技术社区  ›  Mike DeSimone

线程中的C或C++ HTTP守护进程?

  •  7
  • Mike DeSimone  · 技术社区  · 15 年前

    我正在使用freertos启动一个新的嵌入式系统设计。我的上一个使用了ecos,它有一个内置的http服务器,非常轻量级,特别是因为我没有文件系统。简而言之,它的工作方式是,每个页面都是一个类似cgi的c函数,在http守护进程需要时被调用。具体来说,您可以编写一个函数:

    int MyWebPage(FILE* resp, const char* page, const char* params, void* uData);
    

    在哪里? page 是url的页面部分, params 是否有任何表单参数(只支持get,而不支持post,这会阻止文件上传,从而使烧录flash成为一种痛苦), uData 是在注册函数时设置的传入的令牌,因此可以让同一个函数为多个具有不同数据的URL或范围提供服务,并且 resp 是一个文件句柄,您可以将http响应(headers和all)写入其中。

    然后,您将函数注册到:

    CYG_HTTPD_TABLE_ENTRY(www_myPage, "/", MyWebPage, 0);
    

    在哪里? CYG_HTTPD_TABLE_ENTRY 是一个宏,其中第一个参数是变量名,第二个是页面URL( * 允许使用通配符;因此 传递给 MyWebPage() ,第三个是函数指针,最后一个是 乌达塔 价值。

    举个简单的例子:

    int HelloWorldPage(FILE* resp, const char*, const char* params, void*)
    {
        fprintf("Content-Type: text/html;\n\n");
        fprintf("<html><head><title>Hello World!</title></head>\n");
        fprintf("<body>\n");
        fprintf("<h1>Hello, World!</h1>\n");
        fprintf("<p>You passed in: %s</p>\n", params);
        fprintf("</body></html>\n");
    }
    CYG_HTTPD_TABLE_ENTRY(www_hello, "/", HelloWorldPage, 0);
    

    (实际上, 帕拉姆 将通过一个函数来转义HTML魔术字符,我将使用另两个函数来分割参数并使 <ul> 但为了清楚起见,我把它忘了。)

    服务器本身只是作为一个任务(即线程)运行,只要它的优先级低于关键任务,就不会碍事。

    不用说,这对于测试和调试来说是无价的。(嵌入式工作的一个问题是,你通常不能抛出一个xterm来用作日志。)因此,当最高程序员反射性地责怪我一些不起作用的东西时(我想,这是一条阻力最小的路径),我可以打开网页,显示他给我发送了错误的参数。在集成中节省了大量调试时间。

    所以无论如何… 我想知道, 有这样的独立图书馆吗? 一些我可以链接的东西,注册我的回调,生成一个线程,然后让它发挥魔力?还是我需要自己动手?我更喜欢C++,但也可以使用C库。

    编辑:因为我要给它一笔赏金,我需要澄清的是,这个库需要有一个开源许可证。

    4 回复  |  直到 9 年前
        1
  •  4
  •   gavinb    15 年前

    我建议您看看libmicrohttpd,嵌入式web服务器:

    它体积小,速度快,有一个简单的C API,支持多线程,适用于嵌入式系统,支持POST,可选地支持SSL/TLS,并且在LGPL或ECOS许可证下可用(取决于)。我相信这符合你的要求。如果你喜欢,在C++中包装是微不足道的。

        2
  •  2
  •   Zitrax dudico    9 年前

    Mongoose 是根据 GPLv2 而且是轻量级的(只有一个c文件很容易包含在新项目中)。它将在单独的线程中运行并支持回调。

        3
  •  0
  •   Goz    15 年前

    http://www.ibm.com/developerworks/systems/library/es-nweb/index.html

    似乎正是你想要的。你我需要做少量的重新编写,使它运行在freertos下,但它是一个非常小,非常轻量级的web服务器。

        4
  •  0
  •   SenseDeep    9 年前

    我不熟悉freertos,也不知道它是如何支持tcp/ip和sockets的,所以我不能肯定,但您可能想看看goahead web服务器。 http://embedthis.com/goahead/