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

Mik*_*one 7 c++ http

我正在使用FreeRTOS开始新的嵌入式系统设计.我的最后一个使用了eCos,它有一个非常轻量级的内置HTTP服务器,特别是因为我没有文件系统.简而言之,它的工作方式是每个页面都是类似CGI的C函数,在HTTP守护程序需要时调用它.具体来说,您可以编写以下形式的函数:

int MyWebPage(FILE* resp, const char* page, const char* params, void* uData);
Run Code Online (Sandbox Code Playgroud)

pageurl的页面部分在哪里,params是任何表单参数(只支持GET,而不是POST,这会阻止文件上传,从而使闪存变得很麻烦),uData是一个在你注册函数时设置的令牌,因此,您可以使用相同的函数为多个URL或具有不同数据的范围提供服务,并且resp是您将HTTP响应(标题和所有)写入的文件句柄.

然后你注册了这个函数:

CYG_HTTPD_TABLE_ENTRY(www_myPage, "/", MyWebPage, 0);
Run Code Online (Sandbox Code Playgroud)

其中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);
Run Code Online (Sandbox Code Playgroud)

(实际上,params将通过一个函数来传递HTML魔术字符,并且我会使用另外几个函数来分割参数并从中<ul>删除它,但为了清晰起见,我将其留下了.)

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

毋庸置疑,这对于测试和调试来说非常宝贵.(嵌入式工作的一个问题是你通常不能将XTerm作为日志使用.)因此,当Supreme Programmer反复指责我没有工作的东西(我认为阻力最小的路径)时,我可以把网页并显示他向我发送了错误的参数.在集成中节省了大量的调试时间.

无论如何...我想知道,有这样的东西作为一个独立的图书馆吗? 我可以链接的东西,注册我的回调,产生一个线程,并让它做魔术?或者我需要自己动手?我更喜欢C++,但也可以使用C库.

编辑:由于我正在给它一个赏金,我需要澄清该库需要在开源许可下.

gav*_*inb 4

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

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