加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 04:51:37 所属栏目:百科 来源:网络整理
导读:我正在使用FreeRTOS启动新的嵌入式系统设计.我的最后一个使用了eCos,它有一个非常轻量级的内置HTTP服务器,特别是因为我没有文件系统.简而言之,它的工作方式是每个页面都是类似CGI的C函数,在HTTP守护程序需要时调用它.具体来说,您可以编写以下形式的函数: in
我正在使用FreeRTOS启动新的嵌入式系统设计.我的最后一个使用了eCos,它有一个非常轻量级的内置HTTP服务器,特别是因为我没有文件系统.简而言之,它的工作方式是每个页面都是类似CGI的C函数,在HTTP守护程序需要时调用它.具体来说,您可以编写以下形式的函数:
int MyWebPage(FILE* resp,const char* page,const char* params,void* uData);

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

然后你注册了这个函数:

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

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

这是一个简单的例子:

int HelloWorldPage(FILE* resp,const char*,void*)
{
    fprintf("Content-Type: text/html;nn");
    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魔术字符,我会使用另外几个函数来分割参数并从中创建一个< ul>,但为了清楚起见,我把它留了下来.)

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

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

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

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

解决方法

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

> http://www.gnu.org/software/libmicrohttpd/

它体积小,速度快,具有简单的C API,支持多线程,适用于嵌入式系统,支持POST,可选支持SSL / TLS,可在LGPL或eCos许可下使用(视情况而定).我相信这符合您的所有要求.如果你愿意,在C语言中包装它将是微不足道的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读