嵌入式Web服务器设计与实现
2021-05-29
来源:欧得旅游网
第12卷第3期 201 35t 3 }=j 软件导刊 SOftware Guide VOl 12NO 3 Mar 2013 嵌入式Web服务器设计与实现 张同光 (新乡学院计算机与信息工程学院,河南新乡453003) 摘 要:基于ARM10平台的嵌入式Linux,研究了嵌入式Web服务器的设计,并成功实现了对嵌入式Web服务器 的远程访问。 关键词:嵌入式Linux;ARM;Web服务器;线程 中图分类号:TP393 文献标识码:A 文章编号:1672—7800(2013)003—0139—03 Accept—language:zh—cn 0 引言 嵌入式系统是21世纪具有广阔发展前景的技术方 向之一,自20世纪7O年代初出现嵌人式系统的概念以 来,嵌入式系统以其高性能、低功耗等特点获得了高速的 发展。在20世纪末、21世纪初,嵌入式技术又与网络 (额外的回车符和换行符) HTTP响应消息 HTTP/1.1 200 OK Date:Tue,25 Dec 20l2 00:45:45 GMT Server:BWS/1.0 Conneetion:ClOSe Content—Length:9888 技术广泛结合,拓展出许多新的应用领域。本文讲述 了基于ARM10平台的嵌入式web服务器的设计及其 实现。 Content Type:text/html;charset ̄gbk (数据数据数据数据数据…………) 硬件的主要组成:PXA270一RP实验平台。本系统开 发板中的操作系统采用嵌入式Linux,其具有优异、可移 植性强、稳定性高的网络功能,采用2.6.18版本的内核。 2 实现流程 嵌入式web服务器的实现流程如图1所示。一个简 单的嵌入式Web服务器的功能是接收Client发送的请求 1 HTTP协议 HTTP/1.o和HTTP/1.1都把TCP作为底层的传 输协议。HTTP客户首先发起建立与服务器TCP的连 并响应,并根据Client的请求向Client传送所需内容。 查 客户向服务器资源请求 服务器端 监听客户请求 接。一旦建立连接,浏览器进程和服务器进程就可以对 Socket进行通信,客户往自己的Socket发送HTTP请求 消息,从自己的Socket接收HTTP响应消息;类似地,服 务器从自己的Socket接收HTTP请求消息,往自己的 Socket发送HTTP响应消息。 客户端接收资源} 发送HTTP协议 解析客户请求字符串 送资源数据卜_ 图1实现流程 读取客户请求资源 ①获取Server当前目录文件列表:将Server当前目 录下所有文件的信息发送给Client,信息包括:文件名、日 期、大小;②获取指定文件:将Client请求的文件发送给 Client;③获取HTMI 类型文件:将Client请求的HTML 类型文件发送给Client;④获取纯文本文件:将Client请 求的纯文本发送给Client;⑤获取JPG图像文件:将Client 请求的JPG图像文件发送给Client;⑥获取GIF图像文 件:将Client请求的GIF图像文件发送给Client;⑦解析 Client请求:分析Client的请求,将请求信息解析为几个 变量,如:请求的命令、文件名、文件类型。 HTTP规范1.0I-RPcl945 ̄和1.1[RFC 2616]定义了 HTTP消息的格式。HTTP消息分为请求消息和响应消 息两类,格式如下: HTTP请求消息 GET/index.html HTTP/1.1 Host:www.baidu.corn Connection:close User-agent:Mozilla/5.0 基金项目:新乡学院自然科学研究计划基金项目(1399020087) 作者简介:张同光(1977一),男,硕士,新乡学院计算机与信息工程学院讲师,研究方向为计算机网络及信息安全、嵌入式系统、Linux。 ・140・ 软件导刊 2013正 3 主要代码 2 int PrintHeader(FILE*f,int contenttype)//发送HTTP 协议数据头 3 { 5 fprintf(f,”HTTP/1.0 200 OK\n”);//)l ̄务器回应http 协议数据头的状态行;发送请求成功; 6 switch(content—type){ 8 case t :fprintf(f,”Content—type:text/plain\n”); break;//发送纯文本文件信息; 11 case g :fprintf(f,”Content—type:image/gif\n”); break;//发送gif格式图片信息; 14 case j :fprintf(f,”Content—type:image/jpeg\n”); break;//发送gpeg格式图片信息; 17 case h :fprintf(f,”Content—type:text/html\n”); break;//发送html信息; 20 } 21 fprintf(f,”Server:embedded--httpd 0.1\n”);//发送服 务器版本信息; 22 fprintf(f,”Expires:O\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,”r”))){//通过文件名打开 一个文件,只读属性; 36 fprintf(stderr,”Unable to open JPEG file s, d\n”, name,errno); 37 fflush(f);return一1; 4O } 42 PrintHeader(f,j );//发送J类型的http协议数据头信息; 45 copy(infile,f);/ prints the page*/ 48 fclose(infile);return 0; 52 } 54 int DoGif()、DoDir()、DoHTML()、DoText()类似DoJpeg() 161 int ParseReq(FILE*f,char*r) 162 { 163 char*bp;struct stat stbuf;char*arg;char*c; int e;int raw; 174 while(*(++r)!一 );/*skip non—white space *///判断bur中的内容是否为空跳过非空白; 175 while(isspace(*r))r++;//判断r所在位置的字 符是否为空格,若为空格则r指向下一个字符; 178 while(*r=一 /9 r++;//判断r所在位置的字符是 否为/若为空格则r指向下一个字符; 180 bp—r;//将r所指向的内容赋值给bp bp指向/之后 的内容;img/baidu—sylogo1.gif HTTP/1.1\rkn 182 while(*r 8L&(*(r)!= ‘)&&(*(r)!一 ? ))r++;//当r不为空,并求r不为?时r指向下一个字符 189 if(*r一一 ? ){//判断r是否为?若为?则执行 以下语句; 191 char*e;*r=0;arg—r+1; 194 if(e=strchr(arg, )){*e一 \O ;)//如果arg为 空则将arg所在位置置为\O复制给e; 198 )else{//如果当前r指向字符不为 ? ,将r指向字 符置为 \O , 200 arg一0;*r 0; 202 ) 204 c bp; 207 if(c[O]=一Ox20){c[O]一 . ;c[1]一 O ;)//判断c 中的字符内容是否为空格;若为空格 212 if(c[O]一一,\O )strcat(c,”.”);//若c中为\O则将. 链接在c后 214 if(c 8L&!stat(c,&stbuf)){//通过文件名c获取 文件信息,并保存在stbuf中 218 if(S_ISDIR(stbuf.st—mode)){//判断结果是否为特 定的值 219 char*end=c+strlen(c);//end指向c的末尾; 221 strcat(c,”/index.html”);//将/index.html加到c 后,后面追加\O; 222 if(!stat(c,&stbuf))//通过文件名c获取文件 信息,并保存在stbuf中;成功返回0 223 {DoHTML(f,c);//对html文件进行处理; 225 }else{*end一 O ;)DoDir(f,c);//若c中没有/ index.html则跳到目录处理代码处执行 231 )else if(!strcmp(r一4,”.gif”))//判断r中的后 四个字符,即判断文件类型; 233 DoGif(f,c);//若是gif格式的文件则跳转到 DoGif对其进行处理; 234 else if(!strcmp(r一4,”.jPg”)1 l!strcmp(r一 5,”.jpeg”)) 235 DoJpeg(f,c);//若是jpg或jpeg格式的文件则 跳转到DoJpeg对其进行处理 236 else if(!strcmp(r一4,”.htm”)ll!strcmp(r一 5,”.html”)) 237 D0HTML(f,c);//若是htm格式的文件则跳转到 DoHTML处对其进行处理 238 else DoText(f,c);//若是纯文本格式的文件则跳转 到DoText对其进行处理 240 }else{ 242 PrintHeader(f, K);//发送h类型的http协议数据 头 244 fprintf(f,”<html><head><title>404 File Not F0und</title></head>\n”);//打印出错信息 245 fprintf(f,”<body ̄The requested URL was not found on this server%/body></html>\n”); 247 )return 0; 249 } 257 int HandleConnect(int fd) 258 { 259 FILE*f;char buf[160];char buflE16o]; 第3期 张同光:嵌入式Web服务器设计与实现 264 f—fdopen(fd,”a+”);//以文件描述符的形式打开文 件;a+以附加方式打开可读写的文件。若文件不存在,则会建 立该文件,如果文件存在,写入的数据会被加到文件尾后,即文 件原先的内容会被保留。 272 setbuf(f,O);//将关闭缓冲区; 276 if(!fgets(buf,150,f)){//直接通过f读取150个字 符放入以buf为起始地址中,不成功时返回0则打印出错信息; 否则fgets成功返回函数指针打印buf的内容; 277 fprintf(stderr,”httpd:Error reading connection.er— ror d\i1”,errno); 278 fclose(f);return 0; 281 ) 288 referrer[0]=,\O content—length一一1; 293 while(fgets(bufl,150,f)&&(strlen(buf1)>2)) {//直接通过f读取150个字符放入以bufl为起始地址的空间 中; 298 if(!strncasecmp(bufl,”Referer:”,8)){//将bufl 中的前八个字符与字符串Referer:若相等则将将指针指向bufl 中的Referer:之后; 299 char*c—bufl+8: 300 while(isspace(*c))c++;//判断c处是否为空格 若为空格则e指向下一个字符; 302 strcpy(referrer,c);//将e所指的内存单元的内容 复制到referrer数组中; 303 )else if(!strncasecmp(bufl,”Referrer:”,9))f// 将bufl中的前九个字符与字符串Referrer:若相等则将将指针 指向buff中的Referrer:之后; 305 char*c=bufl+8;char*c=bufl+9: 307 while(isspaee(*c))c++;//N断c处是否为空格 若为空格则c指向下一个字符; 309 strcpy(referrer,c);//将c所指的内存单元的内容 复制到referrer数组中; 310 )else if(!strncasecmp(bull,”Content—length:”, 15)){)){//将bufl中的前15个字符与字符串Content— length:若相等则将将指针指向bull中的Content—length:之 后; 313 content—length=atoi(bull+l5);//atoi类型转换 将bufl中的内容转换为整型赋值给content—length; 314 } 315 ) 324 ParseReq(f,buf);//解析客户请求函数; 327 fflush(f);felose(f);return 1; 331 ) 335 void*key(void*data){从键盘输入一个字符,若输入q 则退出程序;) 349 int main(int arge,char*argvE]) 350 { 351 int fd,s;int len;volatile int true=1; 354 struct sockaddr in ee,server—sockaddr;//定义结构体 变量; 357 pthreadt th—key;void*retval; 365 chroot(HTTI’DD0CUMENT—RO0T);//改变根目 录;在makefile文件中指定; 366 printf(”starting httpd…\n”);//打印启用服务器程序 信息; 367 printf(”press q to quit.n”); 370 if(argc>1&&!strcmp(argv ̄11,”一 ))(//若 argv[1]等于一i strcmp返回0并且argc大于1执行if下的语 句快即关闭文件描述符; 372 felose(stderr);HandleConnect(0);//向HandleCon— nect函数传人0文件描述符即标准输入; 374 exit(O): 375 } 388 server sockaddr.sin—family—AFINET —389 server—soekaddr.sinport—htons(SERVER_PORT); 390 serversockaddr.sinaddr.s addr—htonl(INADDRANY); 392 if(bind(s,(struct soekaddr*)&server soekaddr,si— zeof(server sockaddr))=一一1)f 395 perror(”Unable to bind socket”);exit(1); 397 } 399 if(1isten(s,8*3):一一1)f perror(”Unable to lis— ten”);exit(4);) 405 pthreadcreate(&th—key,NULL,key,0);//g0建线 程; 407 printf(”wait for connection.\n”); 408 while(1)f len—sizeof(ec); 411 if((fd—accept(s,(void*)&ee,&len))=一~1)f //接受客户机的请求,与客户机建立链接; 412 exit(5);close(s);} 415 HandleConnect(fd);//处理链接函数调用fd为客户连 接文件描述符; 417 ) 418 pthread_join(th—key,&retva1);//以阻塞的方式等待 thread指定的线程结束。当函数返回时,被等待线程的资源被 收回。如果进程已经结束,那么该函数会立即返回。成功返回 0;该语句不会执行到; 420 } 嵌入式Web服务器的程序算法流程如图2所示。 解析客户请求 字符串对空格 进行处理 蹴资源不存在广———’ — 户端 、各,卜|师 求资 发送当前目录 否存 Index.html 否 lEX文 发送当前 发送 目i 否存 目录信息 文件数据 判断客户请求文件类型 JpG/JPEG文科 发送协议头: Content-type:image/jpeg 是GIF文件 发送协议头: Content-type:image/gif .是HTML文件 发送协议头: Content-type:image/html 是纯文本文件 发送协议头: Content-type:image/plain 图2程序算法流程 第12卷第3期 201 3年3月 VoI 12NO 3 Mar 201 3 一种P2 P直播系统网络模型研究 陈南平 (湖北大学数计学院,湖北武汉430062) 摘 要:研究了P2P直播系统网络模型,并在此基础上提出一种基于可信节点的半结构化的网络模型(SSPM)。该 模型结合了结构化网络模型中的对相邻节点有序组织和混合式网络模型的快速搜索的优点,利用可信节点良好的时 间恒定性和性能稳定性,使该新型模型在实际网络环境下能达到较优的性能。 关键词:P2P网络;SSPM网络模型;可信节点 中图分类号:TP393 文献标识码:A 文章编号:1672—7800(2013)003—0142—03 以传送控制信令、管理信息和其它数据文件。其具体的应 0 引言 基于P2P的流媒体服务技术策略利用客户端计算机 空闲的资源提供部分服务,通过让客户机缓存一部分信 息,充当服务器的部分功能,使网络中的资源和服务分散 用包括NapsterMP3音乐文件搜索与共享、BitTorrent多 点文件下载、PPI ive直播、Skype VolP话音通信、QV()D 和迅雷等。对P2P流媒体研究的关键技术主要集中在网 络拓扑、数据传输和调度以及网络监控等方面。本文在 P2P网络主流模型基础上提出了一种基于可信节点的半 结构化P2P网络模型,并对新模型实现方式和重要过程 进行详细描述,最后得出结论。 化。P2P的网络架构在进行媒体通信时不存在中心节点, 节点(Peer)之间是对等的,即每一对节点可以进行对等的 通信。一个对等节点同时充当服务器的角色和客户端的 角色,这使得P2P系统内部实现自组织的资源共享,有效 1 P2P网络主流模型概述 (1)集中式P2P网络模型。媒体资源存储在各个对 在浏览器端监视开发板上的采集数据;可以使用仿真模拟 地降低了应用成本,提高了系统资源的整体效率。P2P可 以用来进行流媒体通信(如话音、视频或即时消息),也可 4 测试 打开Web浏览器,在地址栏输入开发板的IP地址, 即可看到嵌入式Web服务器返回的主页面。 采集数据,使在客户端浏览器中的显示数据不断变化。 参考文献: [1] 车飞锋,盂开元,曹庆年.基于ARM的嵌入式Web服务器的研究 与实现[J].微计算机信息,2008(26). 5 结语 本文实现了嵌入式Web服务器的基本功能,在此基 [2]杨林楠,李红刚,张素萍,等.基于ARM9的嵌入式Web服务器研 究F-J].计算机测量与控制,2008(12). [3] 王莉,周伟.基于ARM的嵌入式Web服务器设计[J].计算机工程 与应用,2Ol2(14). (责任编辑:孙娟) 础上,可以实现其它实用功能,比如:扩展一个监视功能, Design and Implementation of Embedded Web Server Abstract:Design and Implementation of embedded Web server Based on ARM10 platform and embedded Linux,Implement of remote access to the embedded Web server Successfully. Key Words:Embedded;Linux;ARM;Web Server;thread 作者简介:陈南平(1975一),女,硕士,湖北大学数计学院讲师,研究方向为计算机应用技术。