shttpd和lua结合提供嵌入式web服务
2006-11-13 11:52
751 查看
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更高的效率。 |
相关文章推荐
- shttpd和Lua的组合-提供嵌入式web服务
- 免费的云技术平台--亚马逊WEB服务AWS提供免费方式
- 在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。 编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\41c191fd\ff9345c5\App_Web_login.cshtml.65793277
- 定制微型linux实现启用虚拟终端基于帐号密码登录、提供ssh服务,提供Web服务(下)附有命令移植脚本 推荐
- 嵌入式web服务
- 结合博客园提供的免费功能服务,打造自己专业友善的软件功能组件(主要是思想)
- 结合ajax技术通过web服务实现dotnet非链式工厂模式
- 打印机扫描仪等嵌入式Web服务存在潜在威胁
- 是否可以利用Windows 7提供位置服务的功能结合ArcGIS JavaScript™ Extension for Microsoft Virtual Earth
- 搭建web项目结合spring+cxf的webservice服务
- 打印机威胁:嵌入式Web服务有安全问题
- WEB基础信息提供服务设想
- 编写Web Service客户端访问www.webxml.com.cn提供的服务
- Nancy之结合tinyfox给我们的应用提供简单的数据服务
- 嵌入式linux下web服务构建
- 结合博客园提供的免费功能服务,打造自己专业友善的软件功能组件(主要是思想)
- JavaWeb结合七牛云存储搭建个人相册服务
- kangle web服务器---国内唯一提供技术服务的web服务器
- 语义Web服务的API使用实例:OWL-S API结合matchmaker、推理机(Jena、Pellet)进行语义转换、匹配、组合及调用web服务
- Jquery结合Ajax和Web服务使用三层架构实现无刷新分页