【问题标题】:C or C++ HTTP daemon in a thread?线程中的 C 或 C++ HTTP 守护程序?
【发布时间】:2015-09-29 18:07:24
【问题描述】:

我正在使用 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 响应(标头和所有)写入的文件句柄。

然后你注册了这个函数:

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

其中CYG_HTTPD_TABLE_ENTRY 是一个宏,其中第一个参数是变量名,第二个参数是页面URL(允许使用* 通配符;因此page 被传递给MyWebPage()),第三个是函数指针,最后是uData 值。

一个简单的例子:

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);

(实际上,params 将通过一个函数传递以转义 HTML 魔术字符,我会使用另外几个函数来拆分参数并从中生成一个 &lt;ul&gt;,但我把它留给了清晰度。)

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

不用说,事实证明这对于测试和调试非常宝贵。 (嵌入式工作的一个问题是您通常不能将 XTerm 用作日志。)因此,当 Supreme Programmer 反射性地责备我某些事情不工作时(我猜是阻力最小的路径),我可以拉起网页并显示他向我发送了错误的参数。在集成中节省了大量的调试时间。

所以无论如何......我想知道,有没有类似的东西可以作为一个独立的库使用?我可以链接的东西,注册我的回调,产卵一个线程,让它发挥作用?还是我需要自己动手?我更喜欢 C++,但也可以使用 C 库。

编辑:由于我要对其进行赏金,因此我需要澄清该库需要在开源许可下。

【问题讨论】:

    标签: c++ http


    【解决方案1】:

    我建议你看看嵌入式 Web 服务器 libmicrohttpd:

    它小而快,具有简单的 C API,支持多线程,适用于嵌入式系统,支持 POST,可选地支持 SSL/TLS,并且可在 LGPL 或 eCos 许可下使用(取决于)。我相信这可以满足您的所有要求。如果您愿意,用 C++ 进行包装将是微不足道的。

    【讨论】:

      【解决方案2】:

      MongooseGPLv2 下获得许可,并且是轻量级的(只需一个 C 文件,因此很容易将其包含到新项目中)。它将在单独的线程中运行并支持回调。

      【讨论】:

      • 看起来非常接近。我需要查看源代码,看看它是否会阻塞&lt;form method="POST" enctype="multipart/form-data"&gt;。另一个缺点是它会为您启动线程(假设是 POSIX.4a,我猜?),但这应该不是什么大问题。
      【解决方案3】:

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

      看起来正是你所追求的。我需要进行少量重写才能让它在 FreeRTOS 下运行,但它是一个非常小、非常轻量级的 Web 服务器。

      【讨论】:

      • 从该页面:“仅静态页面”。我正在寻找动态页面支持(GET 和 POST,后者需要理智的 Flash 上传支持)。不管怎样,总比从头开始好。
      【解决方案4】:

      我不熟悉 FreeRTOS 以及它如何支持 TCP/IP 和套接字,所以我不能肯定地说,但您可能想看看 GoAhead 网络服务器。 http://embedthis.com/goahead/

      【讨论】:

      • FreeRTOS 不提供自己的 IP 堆栈,但它支持 LwIP 和 uIP。基本上,我可以使用支持类套接字 API 的库,或者如果库需要我编写一些“发送这些字节”和“接收这些字节”函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      相关资源
      最近更新 更多