基于linux的webserver编程实例文档格式.docx
- 文档编号:18966477
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:13
- 大小:96.08KB
基于linux的webserver编程实例文档格式.docx
《基于linux的webserver编程实例文档格式.docx》由会员分享,可在线阅读,更多相关《基于linux的webserver编程实例文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
bodybgcolor="
cyan"
>
/*设置页面背景颜色为青绿色*/
h1align="
center"
/h1>
/*定义最大标题并居中*/
palign="
2008-12-11<
/p>
/*设置日期居中*/
formaction="
http:
//192.168.1.233/cgi-bin/run.cgi"
/*生成一个链接到"
的表单*/
<
inputtype="
submit"
value="
查看"
/*生成一个“查看”按钮*/
/form>
/body>
/html>
scripttype="
text/javascript"
/*创建脚本的格式为javascript*/
varXMLdoc;
/*创建XMLdoc对象*/
functionloadXML()
{
if(window.ActiveXObject)/*判断是否支持ActiveX控件*/
{
XMLdoc=newActiveXObject("
Microsoft.XMLDOM"
);
/*实例化一个ActiveX控件*/
XMLdoc.async=false;
XMLdoc.load("
adc.xml"
/*读取xml文件*/
getmessage();
/*函数调用*/
}
setTimeout("
loadXML()"
1000);
/*页面每1000毫秒刷新一次*/
}
functiongetmessage()/*获取旋钮值*/
document.getElementById("
ch_0"
).innerHTML=XMLdoc.getElementsByTagName("
)[0].childNodes[0].nodeValue;
/*从xml文件里取出ch_0的值写入网页中id为ch_0的文件中*/
ch_1"
/*从xml文件里取出ch_1的值写入网页中id为ch_1的文件中*/
ch_2"
/*从xml文件里取出ch_2的值写入网页中id为ch_2的文件中*/
/script>
bodyonload="
bgcolor="
/*背景颜色是青绿色*/
AD远程测试实验<
formalign="
/*生成表单并居中*/
tablewidth="
50%"
border="
1"
align="
/*生成宽度是屏幕的50%,表格线条粗细为1的表格并居中*/
thalign="
colspan=2>
/th>
/*表头单元格内容为"
AD远程测试实验"
并居中*/
tr>
<
tdalign="
通道0<
/td>
spanid="
/span>
V<
/*设置id为ch_0并居中*/
/tr>
通道1<
/*设置id为ch_1并居中*/
通道2<
/*设置id为ch_2并居中*/
/table>
//192.168.1.233/cgi-bin/stop.cgi"
/*生成一个链接到"
停止采集"
/>
/*生成一个“停止采集”按钮并居中*/
?
xmlversion="
1.0"
encoding="
UTF-8"
measure>
ch_0>
0.0<
/ch_0>
/*设置ch_0的初始值为0.0*/
ch_1>
1.0<
/ch_1>
/*设置ch_1的初始值为1.0*/
ch_2>
3.0<
/ch_2>
/*设置ch_2的初始值为3.0*/
stop>
A<
/stop>
/measure>
/*解析通道中的AD数据*/
#include<
stdio.h>
fcntl.h>
sys/ioctl.h>
unistd.h>
time.h>
voidgetdata(char*buff,intadcfd,intret)/*AD数据的采集,并进行格式转换*/
inttemp;
inti=0,j;
for(j=0;
j<
3;
j++)/*控制通道的循环*/
ioctl(adcfd,j,0);
/*控制I/O通道*/
read(adcfd,&
temp,sizeof(int));
/*将开发板的值返回到temp*/
temp+=16;
temp=temp/31;
for(;
i<
ret;
i++)
{
if((buff[i]=='
'
)&
&
(buff[i+1]=='
c'
(buff[i+2]=='
h'
))
break;
/*判断字符串"
ch"
是否出现,若出现,跳出循环,进行数据转换;
若没有,继续循环.*/
}
buff[i+6]=(temp/10)+48;
buff[i+8]=(temp%10)+48;
/*获取数据赋值给temp,并进行格式的转化*/
i++;
}
voidlock_set(intfd,inttype)/*文件上锁函数,在主程序中将被调用*/
structflocklock;
/*定义结构体flocklock*/
lock.l_whence=SEEK_SET;
lock.l_start=0;
lock.l_len=0;
lock.l_type=type;
while
(1)
if((fcntl(fd,F_SETLK,&
lock))==0)
return;
/*判断文件是否被锁定,若锁定,则退出;
否则,继续锁定*/
intmain(void)
pid_tpc;
intadcfd,xmlfd,ret;
unsignedcharbuff[150];
inti;
pc=fork();
/*创建主线程,用于打印一些HTML代码,使页面跳转到adc.html页面去,打印完HTML信息后该线程就退出*/
if(pc<
0)
printf("
forkerror!
\n"
return-1;
/*判断进程,若pc<
0,打印"
"
若pc>
0,打印HTML文档*/
}elseif(pc>
/*打印HTML文档*/
Content-type:
text/html\n\n"
bodybgcolor=\"
cyan\"
printf("
metahttp-equiv=\"
refresh\"
content=\"
1;
url=http:
//192.168.1.233/adc.html\"
/*使页面跳转到adc.html页面*/
exit(0);
else
setsid();
/*脱离父进程*/
chdir("
/"
/*改变当前目录*/
umask(0);
/*重设文件权限掩码*/
for(i=0;
i<
65535;
i++)
close(i);
/*关闭设备文件描述符*/
adcfd=open("
/dev/adc"
O_RDWR);
/*打开adc设备文件*/
if(adcfd<
0)
printf("
Cannotopenadcdevice!
/*判断能不能打开adc设备文件,若打开继续下面程序;
反之,打印出不能打开adc设备*/
returnadcfd;
while
(1)
while
(1)
{
xmlfd=open("
/var/www/adc.xml"
/*打开adc.xml文件*/
if(xmlfd<
{
continue;
}
else
lock_set(xmlfd,F_WRLCK);
/*给文件上锁,避免其他进程对该文件进行写操作*/
break;
}
ret=read(xmlfd,buff,150);
/*将xml值读到buff*/
for(i=0;
if(buff[i]=='
$'
)/*如果为'
,则说明用户按下了"
键,结束程序*/
buff[i]='
A'
;
lseek(xmlfd,0,SEEK_SET);
/*移动文件指针*/
write(xmlfd,buff,ret);
/*写入修改后的值*/
lock_set(xmlfd,F_UNLCK);
/*给文件上锁,阻止被删除*/
close(xmlfd);
close(adcfd);
return0;
getdata(buff,adcfd,ret);
lseek(xmlfd,0,SEEK_SET);
write(xmlfd,buff,ret);
/*采集数据并把数据显示在页面上,以便于监测*/
lock_set(xmlfd,F_UNLCK);
/*给xml文件上锁*/
close(xmlfd);
sleep
(1);
close(xmlfd);
close(adcfd);
return0;
voidlock_set(intfd,inttype)
/*定义flocklock结构体*/
/*读写位置指向文件头*/
intfd,ret;
charbuff[150];
/*打印HTML文档*/
metahttp-equiv=\"
content=\"
//192.168.1.233\"
/*停留在此页面,不断刷新*/
fd=open("
../adc.xml"
/*打开adc.xml文件*/
if(fd<
continue;
/*判断文件是否打开,若没打开,继续;
若打开,给文件上锁*/
else
lock_set(fd,F_WRLCK);
break;
ret=read(fd,buff,150);
/*将标志文件中的值读到buff*/
for(i=0;
if((buff[i]=='
s'
t'
o'
(buff[i+3]=='
p'
))/*判断是否出现字符串"
stop"
若出现,跳出循环,执行下面操作;
反之,一直循环*/
break;
buff[i+5]='
/*如果为‘$’,则说明用户按下了“停止采集”键,结束程序,否则继续执行*/
lseek(fd,0,SEEK_SET);
write(fd,buff,ret);
/*写文件,改变文件内容,以便视频采集程序能检测到该变化*/
lock_set(fd,F_UNLCK);
/*给文件上锁*/
close(fd);
return0;
(1)index.html是我们在IE浏览器的地址栏中输入服务器IP地址时所看到的页面,当点击查看按钮时,页面会跳转到数据采集的显示页面,同时,服务器的后台程序也会开始运行,对我们的三个输入通道进行采集,是索引网页,是让用户进行使用
(2)adc.html这个文件的页面就是我们在按下上面的Index.html的查看按钮后跳转过来的,它分别显示了我们的开发板上的三个AD通道的采样值,是为数据采集而制作的网页
(3)Adc.xml后台服务程序也会对这个文件进行读写,从而达到服务器和用户进行数据交换的目的。
(4)Run.c这个程序是在点击第一个页面(index.html)上的“查看”按钮后执行的。
程序的开始会调用fork来创建两个线程:
一个主线程,用于打印一些HTML代码,使页面跳转到我们的adc.html页面去,打印完HTML信息后该线程就退出;
另一个子线程执行真正的AD数据采集,它读取三个通道的AD值,并对读出来的值进行转换,并将读取的结果写入adc.xml文件中,供用户检索。
同时,这个线程还会检查adc.xml的<
标签中的内容,如果为’$’,则说明用户按下了“停止采集”键,那么就结束程序的执行,否则继续执行。
(5)Stop.c该程序的实现比较简单,当用户按下数据采集页面的“停止采集”按钮后,会执行这个程序。
本程序是改变adc.xml文件中的<
标签中的内容,在其中插入一个’$’字符,当我们的数据采集程序检测到这个变化后,就会停止采集。
(1)在实验目录下为本实验创建webserver目录
(2)进入webserver目录,使用编辑器vim建立文件webserver,将实验指导中有关代码粘贴过来
(3)我们的光盘中提供了boa的源代码boa-0.94.13.tar.gz,解压该文件
(4)编译BOA服务器和CGI程序
(5)配置BOA服务器,另外在实验目录的/etc目录下还需要一个mime.types文件,直接从主机上的/etc目录拷贝。
(6)启动开发板,制作完成rootfs,通过mkcramfs工具生成root.cramfs只读文件系统,1)确认serverip是Linux虚拟机的IP地址;
2)将生成的uImage文件拷贝到tftpboot目录下;
3)在ARM开发板上运行命令;
把uImage文件下载到ARM开发板的SDRAM中0x30008000开始的空间中;
擦除NandFlash中起始地址为0x380000,大小为0x400000的空间;
把SDRAM中0x30008000开始的内容写入NandFlash0x380000开始的空间内,大小为0x400000
(7)[up-class2410#]setenvbootcmdnandread0x300080000x800000x250000\;
bootm
此项是内核自动启动的参数,如果已设置就不用再重新设置
[up-class2410#]setenvbootargsroot=/dev/mtdblock2init=/linuxrc(接上面空一格)console=ttySAC0,115200
[up-class2410#]saveenv
(8)把上面的index.html、adc.html和adc.xml三个文件拷贝到开发板的/var/www目录下;
把前面编译得到的run.cgi和stop.cgi拷贝到/var/www/sgi-bin目录下;
还要在/var/log/boa目录下建立一个error_log文件
(9)把刚才编译得到的boa可执行文件拷贝到/bin目录下,然后执行boa命令,就可以启动boa服务器了
(10)手动加载该平台配套的ADC设备驱动s3c2410-adc.ko.并且手动建立好ADC设备节点,这样本次实验程序才可以正确调用该设备接口
(11)创建完成后设置权限,所有用户具有全部权限
(12)在PC机的IE浏览器中输入开发板的IP地址
(13)转动开发板上的AD输入的三个旋钮,查看三个通道的采样值是否变化。
点击“停止采集”按钮后,会跳回第一个页面,点击第一个页面的“查看”可以重新开始。
经过对linux嵌入式系统一个学期的学习,我觉得获益匪浅,通过看ppt和听老师讲课,我觉得有些部分很难掌握,像linux内核移植、uboot移植、驱动不是完全理解,有些命令不会用,例如,压缩解压命令,下载命令等记不住。
但是像lcd和ts、ad远程采集实验等等比较容易掌握。
实验的过程中也遇到一些问题,像内核烧写不成功、程序不能实现结果等,但这些都通过老师和同学的帮助得到了很好的解决。
我觉得在实验之前一定要把基本知识熟练掌握,否则实验很难实施。
实验过程中培养了我在实践中研究问题、分析问题和解决问题的能力,使我对linux这门课了解的更多,掌握的更多。
我希望老师在讲课的过程中可以适当的放慢点速度。
我相信这门课以后会给我带来很多帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 linux webserver 编程 实例