shttpd和Lua的组合-提供嵌入式web服务

简单介绍:
  lua是一个小巧的脚本语言,专用于嵌入和扩展。它和C/C++代码有着良好 的交互能力。由于体积小,很适合嵌入到其他程序中为程序提供脚本功能。 lua在大多数平台上都可以顺利编译、运行。网址 http://www.lua.org

  shttpd是一个小巧的web服务器,小巧到只有一个.c文件,4000余行代码。 虽然体积很小,却具备了最基本的功能,比如CGI。它既可以独立运行, 也可以嵌入到其他的应用程序当中。shttpd在大多数平台上都可以顺利 编译、运行。网址 http://shttpd.sourceforge.net

 
应用方式:
  很多设备都提供Web服务用于配置,比如路由器,ADSL猫等等。这种设备所 提供的web服务的典型用例是用户填写一些参数,提交给Web服务器,Web服务器 将这些参数写入硬件,并将操作结果或者其他信息生成页面返回给浏览器。 如果使用Apache,PHP,MySQL这种组合,一方面资源未必能承受,另一方面这些 硬  件所使用的操作系统也未必能支持这些软件(如pSOS,VxWorks,WinCE)。

  如果shttpd和lua结合起来,一个用来提供基本的web服务,另一个用来编写 CGI脚本,应该是一个很不错的选择。他们都具备体积小,占用资源少的特点, 又都宣称源码级可移植。如果有更高的需要,也可以把sqlite加入,提供数据 库服务(sqlite是一个嵌入式的数据库,同样体积小巧,并且可以在很多平台 上工作)。不带sqlite,体积仅仅300k,加上sqlite大约500k,对于嵌入式应 用非常合适。

向WinCE移植:
  虽然lua使用的是比ANSI还要小的clean C,并且号称在所有平台上不用修改 任何东西就可以直接make成功,但是WinCE却是一个例外。事实上,对大多数 源码级可移植的C/C++程序,WinCE都是一个例外:因为它对标准C库的支持是 不完整的。

  Lua 5.0版本的时候,有人提供了一个for WinCE的移植,工作的很好。基于 这个移植,我把Lua 5.1也移植了过去。因为Lua使用的是clean C,所以需要 做的改动不算很多,具体参看代码中的lua.c,lua.h,error.h和luacerun.c就 明白了。

  shttpd就麻烦得多了,一方面它使用的是ANSI C,需要自己实现的函数更多, 比如文件读写,线程操作等。这些部分虽然麻烦,但是我还是一个个的把这些 缺失的函数自己实现了。更严重的是,WinCE 缺失了两个必不可少的特性: 管道和环境变量。

  传统的CGI执行原理是web server通过管道将CGI程序的标准输入输出重定向, 从而向CGI程序发送数据并接收其输出的结果,同时通过设置CGI进程的环境变量, 将HTTP请求的各种信息传递给CGI程序,其中包括GET命令的查询串。这两个功能 WinCE都没有。 重定向的问题,可以通过编写特殊的WinCE驱动模拟解决,但是 也很受限制,使用不便;环境变量的问题则一点办法也没有了。

解决方案:
  不过Lua为我们提供了可能的解决方案: 将Lua引擎直接嵌入shttpd。

  如果将Lua直接嵌入shttpd,那在处理CGI请求的时候,我们不再需要创建新的 进程,而只需要创建一个新的Lua解释器,并交给一个线程去执行就可以了,这样 不仅在效率上有了提高,也可以适应某些古老的不支持多进程的操作系统了(在 这样的系统上,需要把shttpd也嵌入到主程序当中去)。为了传递原来用环境变 量方式传递的数据,我们在执行脚本之前,在新创建的Lua的解释器里创建一个叫 REQUEST的mapping类型的变量,将所有的数据设置在这个变量中。这样在脚本中 就可以直接使用这个变量了。

  CGI程序还必须能够从标准输入接收POST请求,以及从标准输出发送HTML页面。 这一点可以通过修改shttpd,为Lua引擎扩展两个函数来实现,分别是HTTPRead和 HTTPWrite。在脚本中调用这两个函数来实现输入和输出。为了使用方便和习惯, 再把标准的print和io.read函数指向HTTPWrite和HTTPRead(函数在Lua中是第一 类型)。

  这两个问题解决之后,剩下的就是用Lua脚本写一个简单的CGI开发框架了, LuaCGI就是一个很好的框架,只需要把它所使用的SAPI替换成shttpd提供的 接口就可以了。

总结:
  用shttp+lua的组合,可以在各种不同的平台,尤其是嵌入式平台上提供web服务 ,满足在资源有限的环境中工作的需要。由于Lua是直接嵌入到shttpd中的,它 有着比一般的CGI更高的效率。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值