嵌入式linux应用开发课程设计.docx
- 文档编号:27127323
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:13
- 大小:355.76KB
嵌入式linux应用开发课程设计.docx
《嵌入式linux应用开发课程设计.docx》由会员分享,可在线阅读,更多相关《嵌入式linux应用开发课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
嵌入式linux应用开发课程设计
电子信息类课程设计
课程名称:
嵌入式linux应用开发课程设计
设计题目:
嵌入式linuxWeb服务器的设计
农林大学金山学院电子信息类
课程设计结果评定
评价内容
评价指标
评分权值
评定成绩
工作态度
工作努力,严格按照课程技能训练设计的要求去做,表现好;遵守纪律,工作作风严谨务实。
20
业务水平
能按时优异地完成课程设计任务,能熟练地综合运用所学理论和专业知识,在技能训练中对某些技能、技术有新建议、有小革新、有创见。
动手能力强,实干精神强,团结协作能力强,适应能力强。
30
设计报告质量
报告或成果完整、正确,概念清楚,图纸表格齐全,文字通顺,排版打印符合要求。
40
工作量
按期完成规定的任务,工作量饱满,难度较大。
10
成绩:
指导教师签字:
评定日期:
嵌入式linuxWeb服务器的设计
1.设计的目的
通过课程设计进一步掌握嵌入式linux基本程序设计的能力。
掌握嵌入式linux程序的设计、运行和调试工作。
熟悉搭建嵌入式开发环境及交叉编译器。
掌握下载程序到目标板正确运行。
2.设计要求
熟练应用socket()、bind()、accept()、connect()、send()、recv()等函数,编写网络通信程序,编写makefile文件,通过make工程管理器交叉编译程序,实现宿主PC机使用浏览器访问PXA270-EP目标板的WEB服务器。
3.主要仪器设备(软硬件环境)
本课程设计硬件:
普通的PC机,PXA270-EP嵌入式实验箱。
软件:
Redhat9并配置好ARMlinux开发环境。
4.设计内容
4.1设计原理
Internet的基本协议是TCP/IP协议,然而在TCP/IP模型最上层的是应用层。
它包含文件传输协议(FTP)、简单邮件传输协议(SMTP)、域名系统服务(DNS)、网络新闻传输协议(NNTP)和超文本传输协议(HTTP)等很多高层协议。
本节将运用前面学到的知识编写一个简单功能的基于应用层HTTP协议的Web服务器。
客户端(浏览器)与Web服务器之间的交互主要包含客户的请求和服务器的应答。
请求和应答的格式在超文本传输协议(HTTP)中有定义。
HTTP协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。
它可以使浏览器更加高效,使网络传输减少。
它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。
HTTP服务器则在该端口监听客户端发送过来的请求。
一旦收到请求,服务器(向客户端)发回一个状态行和响应的消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。
1)HTTP请求
HTTP请求信息格式如下所示:
HTTP请求消息:
=请求行实体头信息列表CRLF[实体内容]
请求行:
=方法 URL HTTP版本号 CRLF
方法:
=GET|HEAD|POST|扩展方法
URL:
=协议名称+宿主名+目录与文件名
实体头信息列表:
=实体头信息1CLRF实体头信息2CLRF……实体头信息nCLRF
实体头信息:
=头部字段名:
值
其中"CRLF"表示回车换行。
"请求行"中的"方法"描述了对指定资源执行的动作,常用的方法"GET"、"HEAD"和"POST"等3种
方法
描述
GET
从WEB服务器中获取对象,不同类型的对象将获取不同的信息,比如:
· 文件类型对象,获取该文件的内容。
· 可运行程序类型对象,获取该程序执行的结果。
· 数据库查询类型对象,获取该查询的结果。
HEAD
要求服务器查找对象的元信息。
POST
从客户端向WEB服务器发送数据。
2)HTTP应答
Web服务器处理客户请求,并向客户机发送应答报文,HTTP协议的应答报文格式为如下所示。
应答报文:
=状态行实体头信息列表CRLF[实体内容]
状态行 =HTTP版本号 状态码 原因叙述
实体头信息列表:
=实体头信息1CLRF实体头信息2CLRF……实体头信息nCLRF
实体头信息:
=头部字段名:
值
状态码描述了Web服务器执行客户机请求的状态信息
状态码
含义
1XX
保留
2XX
成功接收,比如“200”表示处理成功。
3XX
客户需进一步细化请求。
4XX
客户错误,比如“404”表示访问的指定资源不存在。
5XX
服务器出错。
4.2总体方案设计
Web服务器实际上是一个目录服务器的扩展,通过HTTP协议读取服务器相关目录上的内容。
Web服务器通常需要具备3种用户操作:
列举目录信息、显示文件内容和运行应用程序。
Web服务器通过基于流的套接字连接,为客户提供上述3种操作。
用户连接到服务器后,用户陆续发送请求,服务器会处理每条客户的请求信息并返回应答信息。
从流程图可以看出,Web服务器和浏览器之间的通信流程为:
客户端(用户的浏览器)向Web服务器发送连接请求,服务器会接收该请求,建立一个套接字连接。
服务器端陆续读取客户端的请求,进行相应的处理并返回应答信息
客户端读取服务器端的应答信息,并将其按照各种格式显示在浏览器中(文本、图片、声音等内容)。
4.3程序设计
1)服务器代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
constcharPATH[]="/mnt/hgfs/shiyan";
//接收web浏览器请求
void*recvMsg(void*param)
{
intlen;
intfd2=*(int*)param;//客户端的sockid
charbuf[1024];
charexname[100];
if(recv(fd2,buf,sizeof(buf),0)>0)
{
len=strlen(buf);
printf("浏览器请求内容为:
%s",buf);
if(strstr(buf,"Accept:
")!
=NULL)//获取浏览器发送的http请求中的内容类别
{
char*pp=strstr(buf,"Accept:
");
char*p1=strchr(pp,'');
char*p2=strchr(pp,',');
strncpy(exname,p1+1,p2-p1-1);
}
printf("name:
%s",exname);//输出text/html或image/png
if(strncmp(buf,"GET",3)==0){
charwebname[100];
char*p1=strchr(buf,'');
char*p2=strchr(p1+1,'');
strncpy(webname,p1+1,p2-p1-1);//获取浏览器请求的文件名
printf("%s",webname);
structstatst;
charfilename[1024]={'\0'};
strcpy(filename,PATH);
strcat(filename,webname);
stat(filename,&st);
charprotol[2048]={'\0'};
charstrTime[200]={'\0'};
charcontent_type[100]={'\0'};
if(strncmp(webname,"/sword.jpg",10)==0)
{
strncpy(content_type,"Content-Type:
image/jpeg\r\n",\
strlen("Content-Type:
image/jpeg\r\n"));
}
else
{
strncpy(content_type,"Content-Type:
\
text/html\r\n",strlen("Content-Type:
text/html\r\n"));
}
char*wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_ttimep;
structtm*p;
time(&timep);
p=gmtime(&timep);
sprintf(strTime,"%s,%d-%d-%d%d:
%d:
%d\n",wday[p->tm_wday],\
(1900+p->tm_year),(1+p->tm_mon),p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
sprintf(protol,"HTTP/1.1200OK\r\n"
"Server:
Apache-Coyote/1.1\r\n"
"ETag:
\"W/8888-8888888888888\"\r\n"
"Last-Modified:
Thursday,2014-11-1212:
00:
00\r\n"
"%s"
"Content-Length:
%dbytes\r\n"
"Date:
%s\r\n"
"Connection:
keep-alive\r\n\r\n",content_type,(int)st.st_size,strTime);
printf("%s",protol);
printf("%s",strTime);
send(fd2,protol,strlen(protol),0);
size_tlen=0;
charfbuf[1024]={'\0'};
constchar*filename2="/mnt/hgfs/shiyan/abc.jpg";
intfd4=open(filename2,O_WRONLY|O_CREAT,0777);
intfd=open(filename,O_RDONLY,0777);
while((len=read(fd,fbuf,sizeof(fbuf)))>0)
{
send(fd2,fbuf,len,0);
write(fd4,fbuf,len);
}
close(fd);
close(fd2);
}
}
pthread_exit(NULL);
returnNULL;
}
intmain()
{
intfd;
structsockaddr_inserveraddr;
structsockaddr_inclientaddr;
memset(&serveraddr,0,sizeof(serveraddr));
while((fd=socket(AF_INET,SOCK_STREAM,0))<0){
printf("socketfailed!
\n");
}
intreuser=1;
setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuser,sizeof(reuser));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(8080);//端口号指定为:
8080
serveraddr.sin_addr.s_addr=inet_addr("192.168.224.134");//设定服务器IP
socklen_tlen=sizeof(serveraddr);
if(bind(fd,(conststructsockaddr*)&serveraddr,len)<0){
printf("binderror\n");
return0;
}
intret=listen(fd,5);
if(ret!
=0)
{
printf("listenerror\n");
return0;
}
else
{
printf("listening......\n");
}
while
(1)
{
socklen_tsize=sizeof(clientaddr);
intfd2=accept(fd,(structsockaddr*)&clientaddr,&size);
if(fd2==-1){
printf("acceptfailed\n");
return0;
}
printf("客户端地址:
%s\n",inet_ntoa(clientaddr.sin_addr));
pthread_tid1;
pthread_create(&id1,NULL,recvMsg,&fd2);
}
close(fd);
return0;
}
4.4程序的调试和运行结果
调试编译:
运行结果:
5.总结
通过这次嵌入式linuxWeb服务器的设计,让我多linux的设计编程有了更深的了解。
特别别是对这次的Web服务器的设计有了很大的进步,通过测试,编写的程序都能顺利运行。
但由于时间紧迫,在很多地方还是做的不好,没能很深入的了解,所以我们课后要更加深入的去学习,自己动手时间多练习
参考文献
[1]刘银水,肖正宇,孙伟.基于ARM-Linux的嵌入式WEB服务器[J].单片机与嵌入式系统应用;2007.06.
[2]杜宝祯,祝静,徐涢基,何鹏举.基于Linux和S3C2440的GPC控制器设计[J].单片机与嵌入式系统应用.2009.11.
[3]吴迅;基于Linux的嵌入式WEB服务器的研究[D].山东师范大学;2010.
[4]马长青.Linux环境下基于Web的图档管理系统的开发[D].山东农业大学;2005.
[5]孙亚军.基于ARM的嵌入式Linux平台的研究与实现[D].东北大学.2009.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 linux 应用 开发 课程设计