龙源期刊网 http://www.qikan.com.cn
嵌入式Web服务器设计与实现
作者:张同光
来源:《软件导刊》2013年第03期
摘 要:基于ARM10平台的嵌入式Linux,研究了嵌入式Web服务器的设计,并成功实现了对嵌入式Web服务器的远程访问。
关键词:嵌入式Linux;ARM;Web服务器;线程
中图分类号:TP393 文献标识码:A 文章编号:16727800(2013)003013903 基金项目:新乡学院自然科学研究计划基金项目(1399020087)
作者简介:张同光(1977-),男,硕士,新乡学院计算机与信息工程学院讲师,研究方向为计算机网络及信息安全、嵌入式系统、Linux。 0 引言
嵌入式系统是21世纪具有广阔发展前景的技术方向之一,自20世纪70年代初出现嵌入式系统的概念以来,嵌入式系统以其高性能、低功耗等特点获得了高速的发展。在20世纪末、21世纪初,嵌入式技术又与网络技术广泛结合,拓展出许多新的应用领域。本文讲述了基于ARM10平台的嵌入式Web服务器的设计及其实现。
硬件的主要组成:PXA270RP实验平台。本系统开发板中的操作系统采用嵌入式Linux,其具有优异、可移植性强、稳定性高的网络功能,采用2.6.18版本的内核。 1 HTTP协议
HTTP/1.0和HTTP/1.1都把TCP作为底层的传输协议。HTTP客户首先发起建立与服务器TCP的连接。一旦建立连接,浏览器进程和服务器进程就可以对Socket进行通信,客户往自己的Socket发送HTTP请求消息,从自己的Socket接收HTTP响应消息;类似地,服务器从自己的Socket接收HTTP请求消息,往自己的Socket发送HTTP响应消息。
HTTP规范1.0\[RPcl945\]和1.1\[RFC 2616\]定义了HTTP消息的格式。HTTP消息分为请求消息和响应消息两类,格式如下: HTTP请求消息
GET /index.html HTTP/1.1
龙源期刊网 http://www.qikan.com.cn
Host:www.http://www.cmpx.com.cn/ Connection:close Useragent:Mozilla/5.0 Acceptlanguage:zhcn (额外的回车符和换行符) HTTP响应消息 HTTP/1.1 200 OK
Date: Tue, 25 Dec 2012 00:45:45 GMT Server: BWS/1.0 Connection:close ContentLength: 9888
ContentType: text/html;charset=gbk (数据 数据 数据 数据 数据…………) 2 实现流程
嵌入式Web服务器的实现流程如图1所示。一个简单的嵌入式Web服务器的功能是接收Client发送的请求并响应,并根据Client的请求向Client传送所需内容。
①获取Server当前目录文件列表:将Server当前目录下所有文件的信息发送给Client,信息包括:文件名、日期、大小;②获取指定文件:将Client请求的文件发送给Client;③获取HTML 类型文件:将Client请求的HTML 类型文件发送给Client;④获取纯文本文件:将Client请求的纯文本发送给Client;⑤获取JPG 图像文件:将Client请求的JPG 图像文件发送给Client;⑥获取GIF 图像文件:将Client请求的GIF 图像文件发送给Client;⑦解析Client请求:分析Client的请求,将请求信息解析为几个变量,如:请求的命令、文件名、文件类型。
3 主要代码
2 int PrintHeader(FILE *f, int content_type) //发送HTTP协议数据头
龙源期刊网 http://www.qikan.com.cn
3 {
5 fprintf(f,\\n\); //服务器回应http协议数据头的状态行;发送请求成功;
6 switch (content_type) {
8 case 't': fprintf(f,\: text/plain\n\); break;//发送纯文本文件信息; 11 case 'g': fprintf(f,\: image/gif\n\); break;//发送gif格式图片信息;
14 case 'j': fprintf(f,\: image/jpeg\n\); break;//发送gpeg格式图片信息;
17 case 'h': fprintf(f,\: text/html\n\); break;//发送html信息; 20 }
21 fprintf(f,\: embedded-httpd 0.1\n\); //发送服务器版本信息; 22 fprintf(f,\: 0\n\); //发送文件永不过期信息; 23 fprintf(f,\\n\); return(0); 26 }
28 int DoJpeg(FILE *f, char *name) //对jpeg格式的文件进行处理; 29 {
30 char *buf; FILE * infile; int count;
34 if (!(infile = fopen(name, \))) { //通过文件名打开一个文件,只读属性; 36 fprintf(stderr, \, %d\n\, name, errno); 37 fflush(f); return -1; 40 }
42 PrintHeader(f,'j'); //发送j类型的http协议数据头信息;