一种嵌入式Web服务器的设计方案

2014-04-29 00:44:03房好帅等
电脑知识与技术 2014年10期
关键词:远程控制

房好帅等

摘要:基于嵌入式ARM-Linux平台,提出了一种Web服务器的设计方案与实现方法,采用Socket编程实现Http协议解析及网络通信,设计了多进程并发请求处理机制,支持html页面和执行CGI程序。在S3C2440硬件平台上测试,能够正确的响应Http远程请求,可用于嵌入式设备的远程控制。

关键词:Web服务器;Socket编程;Http请求;远程控制

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2014)10-2206-03

Abstract: Discusses the design proposal and implementation of Web server based on embedded ARM-Linux platform, Http data package analyzing and network communication are accomplished via socket programming, then put forward the mechanism for the multi-process concurrent request, can support HTML page and the execution of a CGI program. At last testing the implementation on the S3C2440 platform, the web server work well in responsing to the Http remote request, therefore can be used for remote control of embedded devices.

Key words: Web server; Socket programming; Http request; remote control

随着嵌入式系统在工业现场、环境监控等领域的应用逐渐广泛,越来越多的场合需要通过网络对嵌入式设备进行远程控制,因此在基于ARM-Linux平台的解决方案中就需要设计适合于嵌入式设备的Web服务器。当前比较成熟的Web服务器软件如Apache、Nginx、Lighttpd等功能较为完备,占用资源也较多,适合在PC或服务器上运行;比较精简的Web服务器如Boa、thttpd等,运行系统开销较小,很多应用场景中被移植到了嵌入式平台,但一般实现为单进程服务器,当前用户请求处理完成后才能响应下一个用户的请求,不具备并发处理功能。

针对当前Web服务器存在的问题,该文提出一种适合于嵌入式平台的实现方案,考虑到嵌入式平台存在硬件资源限制,设计方案时考虑:1)功能实现精简,支持html页面请求和执行CGI程序即可满足远程控制的要求;2)能够并发处理多个用户的同时请求;3)Web服务器软件交叉编译后能够稳定运行且占用资源少。

1 总体设计方案及流程分析

Web服务器在运行期间通过Http协议与浏览器进行通信,浏览器通过输入URL地址或html form表单向Web服务器发出请求,Web服务器进行解析Http协议数据包,提取请求文件信息与表单数据,之后进行处理相应,总体流程如图1所示。

嵌入式Web服务器软件实现采用Linux C编程,在PC上搭建ARM-Linux交叉开发环境,采用makefile文件进行工程构建管理,最后在S3C2440硬件平台上测试。

2 功能模块设计与实现

2.1 多进程并发请求处理机制

文献[4]提出了包括迭代服务器和并发服务器共9种服务器设计模型,这些模型来源于实际工程实践,可作为本文项目实现的参考。考虑到需要处理用户的并发请求,但并发请求的同时连接数较少,同时也要执行CGI程序,故采用为每个客户请求fork一个子进程的并发服务器模型,其流程如下:

1)父进程采用accept函数阻塞接收客户的连接,当有客户请求发生时,该函数返回一个连接套接字connfd进行与客户通信;

2)父进程采用fork系统调用为请求产生一个子进程,由于子进程与父进程共享连接套接字connfd,故子进程通过connfd获取请求Http协议数据包,进行解析后处理html请求或CGI请求,之后通过connfd发送响应数据包,请求处理结束后关闭connfd。

3)父进程需要关闭连接套接字connfd,将导致其描述符的引用计数减1,这样保证了父进程不会耗尽可用的描述符数,另外当子进程关闭connfd时,描述符的计数为0,保证能够正确的向客户发送连接终止序列。

2.2 Http协议数据包请求解析

Http请求数据包由三部分组成:请求行、消息报头、请求正文,请求行以一个方法符号开头(GET或POST),之后是以空格分开请求的URI,GET方法对应的URI通常还包括请求参数,如/cgi-bin/testform.cgi?u_name=fang&u_password=3241;POST方法的请求参数的解析需要读取请求正文中的Content-Length获取请求参数字符串长度,之后跳过一个空行(只有CRLF的行)后可获取请求参数。

2.3 处理html请求及响应

若请求数据包经过解析请求URL地址为html文件,对应处理步骤如下:

1)检查html存放路径下是否有请求文件,若不存在返回404 Not Found;

2)若请求文件存在,读取文件内容;

3)通过connfd将文件内容发送至请求客户(浏览器),浏览器可以进行解析显示。

2.4 处理CGI请求及响应

若请求数据包经过解析为请求执行CGI程序,首先将请求方法和参数穿递给CGI程序,在子进程中需要根据GET、POST两种具体情况进行处理。如果为GET方法提交参数,其流程为:

1)设置环境变量REQUEST_METHOD为GET:

setenv("REQUEST_METHOD", "GET", 1);

2)设置环境变量QUERY_STRING,其值为参数字符串:

setenv("QUERY_STRING", parameters_string, 1);

如果为POST方法提交参数,其流程为:

1)设置环境变量REQUEST_METHOD为POST:

setenv("REQUEST_METHOD", "POST", 1);

2)设置环境变量CONTENT_LENGTH,其值为参数字符串长度:

setenv("CONTENT_LENGTH", parameters_string_len, 1);

3)将参数字符串写入标准输入,需要将标准输入先进行重定向:

int file_pipes[2];

pipe(file_pipes);

close(0);//关闭进程标准输入

dup(file_pipes[0]);//重定向标准输入

write(file_pipes[1], parameters_string, parameters_string_len);

由于CGI程序采用system系统调用产生一个新的子进程进行执行,CGI程序的执行结果要作为相应信息发送给客户,在本文设计的方案中将stdout重定向到一个临时文件:

char temp_filename[] = "/tmp/temp_file.XXXXXX";

int fd = mkstemp(temp_filename);

unlink(temp_filename);

dup2(fd, fileno(stdout));

CGI程序作为子进程执行可继承父进程的环境变量与打开的文件描述符,故可以获取请求参数字符串。执行完毕后,读取临时文件内容,将文件内容加上http协议响应头,通过connfd发送至请求客户(浏览器)。

2.5 防止僵尸进程的形成

由于父进程采用fork为每个请求产生一个子进程,当请求响应后子进程结束,故需要在父进程中需要通过调用wait或waitpid等待取得子进程的终止状态,避免子进程形成僵尸进程。另外父进程还要负责接收客户的连接,故不能在父进程中采用wait或waitpid阻塞等待子进程终止,这样会影响并发响应。在本文的方案中,采用异步信号的方法防止子进程形成僵尸进程,具体实现方法和原理如下:

1)当子进程终止时,子进程会向父进程发送SIGCHLD信号;

2)父进程中,设置SIGCHLD信号处理函数sigchld_handler进行捕:

signal(SIGCHLD, sigchld_handler);

3)在sigchld_handler中进行waitpid等待:

void sigchld_handler (int signo) {

pid_t pid;

int stat;

while ( (pid = waitpid(-1, &stat, WNOHANG)) >0);

}

由于SIGCHLD为不可靠信号,内核不会对多个信号产生进行排队,故waitpid系统调用需要采用WNOHANG参数,这样在有尚未终止的子进程运行时不会阻塞。

3 在嵌入式平台上测试

3.1 测试环境与案例

采用天嵌公司的S3C2440开发板进行测试,Web服务器经过arm-linux-gcc交叉编译运行于嵌入式平台;CGI程序支持GET、POST两种请求方法,获取点亮的LED序号和操作方式(点亮、熄灭),之后控制LED,实现基于Web的远程控制,流程如图2所示。

编写一测试html文件,内容包括两个form表单,分别测试GET和POST方法,提交的参数格式为:control_type=%s&led_no=%d。

3.2 测试结果

经过测试,html文件内容可以正确的显示在浏览器中,GET和POST方法都可以正确的将请求参数提交到CGI程序;同时进行多个请求没有出现阻塞或是拒绝服务的情况;另外采用ps命令查看进程,没有发现产生僵尸进程的产生,说明3.5提出的方法有效;通过/proc/PID/fd及lsof命令的方法查看父进程的打开的socket描述符,发现都能够正确的关闭,因此本Web服务器可以稳定的长期运行。

4 结束语与展望

本文针对ARM-Linux平台,提出了一种嵌入式Web服务器实现方法,解决了当前已有Web服务器存在的不能处理并发请求的问题,同时功能精简实用,配置运行方法简单,经过实际测试,能够满足嵌入式平台远程控制中应用要求。

参考文献:

[1] 戴丽华.嵌入式Web服务器的研究和应用[J].轻工科技,2013(11):72-74.

[2] 王毅.探析嵌入式Web服务器的设计与实现[J].电子世界,2013(12):17-18.

[3] 王俊,郭书军.嵌入式Web服务器的实现及其CGI应用[J].电子设计工程,2011,19(21):152-155.

[4] W Richard S.UNIX网络编程[M].北京:人民邮电出版社,2010.

[5] 宋凯,严丽平,甘岚.嵌入式Web服务器的设计与实现[J].计算机工程与设计,2009,30(4):808-810.

[6] 谢仕义,徐兵.嵌入式Web服务器的设计及其CGI实现[J].计算机工程与设计,2007,28(7):1598-1601.

猜你喜欢
远程控制
基于SMS的汽车远程智能控制系统设计
软件导刊(2016年12期)2017-01-21 15:05:29
智能可调节动作识别型节能风扇的设计
水冷发射机冷却系统故障分析及解决方案
一种基于单片机技术的家用电器远程控制系统的设计
基于物联网的远程红外控制器
基于Arduino UNO的智能插座设计
盐城地区设计项目与课堂远程互动的方式方法研究
艺术科技(2016年10期)2016-12-14 00:11:02
基于GSM的远程控制系统
短波发射台节目传输控制系统及技术改造
科技视界(2016年17期)2016-07-15 14:45:42
矿山机电设备远程控制技术的应用分析