通过上一个课程“Boa基本设置与使用”的学习,大家在树莓派上应已经会安装、配置、运行Boa服务器,并且访问到服务器上的一个静态网页。
这不是运行Web服务器最终的目的,最终应是通过B/S(浏览器/服务器)模式实现两端的相互。

下面通过一个CGI编程实例来学习,WEB服务器的动态编程技术。“体重指数(BMI)计算器”,用户输入自己的身高与体重后点击计算,服务器就会计算出BMI数值。

课程资源(程序参考代码,图片)http://pan.baidu.com/s/1dF3WIiP

体重指数(BMI)计算器

开发设计流程

Created with Raphaël 2.1.0界面功能设计 静态html文件,html程序显示界面静态cgi文件,cgi程序显示界面动态cgi文件,cgi程序处理用户数据显示调试运行

一、HTML静态显示

1 . 静态的html文件

cgi.html

<html>
<body>
<div align="center"><form action="bmi.cgi" method="GET"><table>
<tr><td rowspan="3"><img src="bmi.png" hight="60" width="120"></td>
<td align="center" colspan="3"><h2>体重指数(BMI)计算器</h2></td></tr><tr><td >身高 : <input type="text" name="cm"  size="3"> cm </td>
<td >体重 : <input type="text" name="kg"  size="3"> kg </td>
<td align="center" ><input type=submit value=" 计 算 " size="16"> </td></tr><tr><td align="center" colspan="3">BMI =
<input type="text" name="ret" value=""  size="3" readonly></tr>
</table>    </form>
</br><img src=bmi_index.png >
</div></body>
</html> 

二、CGI程序输出页面

CGI基本概念

CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。

WEB服务器和CGI程序之间的通讯
服务器和CGI程序之间是通过标准输入输出来进行数据传递的,而这个过程需要环境变量的协作方可实现。

1.服务器将URL指向一个应用程序
2.服务器为应用程序执行做准备
3.应用程序执行,读取标准输入和有关环境变量
4.应用程序进行标准输出

服务器上运行的cgi 通过标准输入(环境变量)来取得客户端用户数据,通过标准输出向客户端返回数据显示。

CGI数据输出
CGI程序如何将信息处理结果返回给客户端?这实际上是CGI格式化输出。
在CGI程序中的标准输出stdout是经过重定义了的,它并没有在服务器上产生任何的输出内容,而是被重定向到客户浏览器,这与它是由C,还是Perl或Python实现无关。
所以,我们可以用打印来实现客户端新的HTML页面的生成。比如,C的printf是向该进程的标准输出发送数据,Perl和Python用print向该进程的标准输出发送数据。

课程中CGI程序使用C语言编程。
向标准输出发送网页内容时要遵守MIME格式规则:
任意输出前面必须有一个用于定义MIME类型的输出内容(Content-type)行,而且随后还必须跟一个空行。

printf( "Content-type:text/html\n\n" );

2 . cgi显示界面程序

bmi.c

#include<stdio.h>int main()
{printf( "Content-type:text/html\n\n" ); printf("<html><body><div align=\"center\">\n");printf("<form action=\"bmi.cgi\" method=\"GET\"><table>     \n");printf("<tr><td rowspan=\"3\"><img src=\"../bmi.png\" hight=\"60\" width=\"120\"></td>    \n");printf("<td align=\"center\" colspan=\"3\"><h2>体重指数(BMI)计算器</h2></td></tr>    \n");printf("<tr><td >身高 : <input type=\"text\" name=\"cm\"  size=\"3\"> cm </td>    \n");printf("<td >体重 : <input type=\"text\" name=\"kg\"  size=\"3\"> kg </td>    \n");printf("<td align=\"center\" ><input type=submit value=\" 计 算 \" size=\"16\">   </td></tr>    \n");printf("<tr><td align=\"center\" colspan=\"3\">BMI =     \n");printf("<input type=\"text\" name=\"ret\" value=\" \"  size=\"3\" readonly></tr>     \n");printf("</table></form></br><img src=\"../bmi_index.png\" >    \n");printf("</div></body>   </html>     \n");return 0;                       }

CGI程序的编译执行

 $gcc bmi.c -o bmi.cgi           //gcc编译器编译$cp bmi.cgi /var/www/cgi-bin/   //拷贝到boa服务器设定的cgi-bin目录//在客户端浏览器输入cgi程序地址如:10.1.1.123/cgi-bin/bmi.cgi 回车后就可看到本文最开始显示的web页面。

三、CGI程序数据处理

CGI环境变量
对于CGI程序来说,它继承了系统的环境变量。CGI环境变量在CGI程序启动时初始化,在结束时销毁。
当一个CGI程序不是被HTTP服务器调用时,它的环境变量几乎是系统环境变量的复制。当这个CGI程序被HTTP服务器调用时,它的环境变量就会多了关于HTTP服务器、客户端、CGI传输过程等项目。

CGI数据传输方式
REQUEST_METHOD:它的值一般包括两种:POST和GET,但我们写CGI程序时,最后还要考虑其他的情况。
1.POST方法
如果采用POST方法,那么客户端来的用户数据将存放在CGI进程的标准输入中,同时将用户数据的长度赋予环境变量中的CONTENT_LENGTH。
2.GET方法
在该方法下,CGI程序无法直接从服务器的标准输入中获取数据,因为服务器把它从标准输入接收到得数据编码到环境变量QUERY_STRING(或PATH_INFO)。
3.POST与GET的区别
以 GET 方式接收的数据是有长度限制,而用 POST 方式接收的数据是没有长度限制的。并且,以 GET 方式发送数据,可以通过 URL 的形式来发送,但 POST方式发送的数据必须要通过 Form 才到发送。

CGI程序实现步骤
从服务器获取数据
C语言实现代码:
POST方法
length = atoi(getenv(“CONTENT_LENGTH”));
inputstring = malloc(sizeof(char)*length + 1);
fread(inputstring, sizeof(char), length, stdin);

GET方法
inputstring = getenv(“QUERY_STRING”);

CGI程序获取数据都是连续字符串要进行解析才能得到独立数据。
getvalue.h文件中给出处理函数get_value( )

3 . cgi数据动态处理程序

在上面bmi.c基础上进行修改,首先在main函数最前面加上以下代码。

int main(){char *val_cm = NULL;char *val_kg = NULL;int cm,kg,len=0;float mm,bmi=0.0;set_env(getenv("REQUEST_METHOD"),getenv("CONTENT_LENGTH"),getenv("QUERY_STRING"));    //<input type="text" name="cm"  size="3">       val_cm = get_value("cm");   //通过变量名获取身高val_kg = get_value("kg");   //通过变量名获取体重 cm = atoi(val_cm);kg = atoi(val_kg);if(cm > 0 && kg > 0){mm = cm/100.0;bmi = (kg / (mm * mm));}
...
//这里是页面显示代码
...
}

下面输出bmi数据的html代码。

printf("<input type=\"text\" name=\"ret\" value=\" \"  size=\"3\" readonly></tr>     \n");

修改成输出计算出用户数据的代码。

if(bmi == 0.0)printf("<input type=\"text\" name=\"ret\" value=\"  \"  size=\"3\" readonly></tr>     \n");
elseprintf("<input type=\"text\" name=\"ret\" value=\" %4.2f  \"  size=\"3\" readonly></tr>     \n",bmi);

编译后copy到cgi-bin目录,现在用户在浏览器就可以输入数据提交后,服务器计算结果显示。

如果浏览器出现502错误,说明 cgi程序运行有问题。可以在终端下运行调试。

树莓派WEB服务器(Boa)CGI编程入门相关推荐

  1. boa服务器如何运行cgi,嵌入式WEB服务器BOA+CGI.ppt

    嵌入式WEB服务器BOACGI 嵌入式WEB服务器:BOA+CGI 报 告 人: 李 实 * ASIPP 随着Internet技术的兴起,在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流 ...

  2. 树莓派WEB服务器(Boa)空气监测项目

    树莓派WEB服务器(Boa)空气监测项目 网页界面参考源码http://pan.baidu.com/s/1dFN8Twt 系统WEB界面 1 . 天气质量界面 2 . 天气预报界面 3 . 系统设置界 ...

  3. 网络知识入门,Web服务器的CGI程序,浏览器如何判断响应内容:文本,图片还是音频文件?(十九)

    目录 将请求的uri转换为实际的文件名 运行CGI程序 web服务器的访问控制 浏览器接受响应并返回内容 浏览器接受响应消息后如何显示内容 浏览器显示网页内容:访问完成 将请求的uri转换为实际的文件 ...

  4. python Web 之基石 - - CGI 编程 (基于python3)

    一 CGI 编程之前缀篇 1CGI 入门简介 2Apache2 的安装以及配置运行环境搭建 二 开始 CGI programming 之旅 HTTP相关知识讲述 - - - first demo 随后 ...

  5. c语言编制编程语言,C语言CGI编程入门(一)

    CGI是指web服务器调用编程语言编写的流程的一个接口.比如我们可以编写一个用户注册的界面,用户将其输入的邮件.用户名.密钥输入并点击注册,此时浏览器就将用户输入的内容发送给了我们后台的CGI程序,我 ...

  6. Linux下小型web服务器boa的使用

    boa是一个小型的web服务器,可以用于多种平台,在嵌入式中比较常见. boa的官方网站为www.boa.org,可以在上面下载最新版本的boa:boa-0.94.13.tar.gz (不过这个&qu ...

  7. c语言 cgi php,C语言CGI编程入门(一)

    CGI是指web服务器调用编程语言编写的程序的一个接口.比如我们可以编写一个用户注册的页面,用户将其输入的邮箱.用户名.密码输入并点击注册,此时浏览器就将用户输入的内容发送给了我们后台的CGI程序,我 ...

  8. boa 传递 数据到 html,使用html网页boa这个web服务器通过cgi控制2410板子上LED灯点亮...

    1.使用boa服务,先交叉编译~/s3c2410/boa/boa-0.94.14rc21,编译器使用 CC = /usr/local/arm/3.4.1/bin/arm-linux-gcc,然后在sr ...

  9. 四、Web服务器——Session Cookie JSP入门 学习笔记

    今日内容 1. 会话技术1. Cookie2. Session 2. JSP:入门学习 会话技术 1. 会话:一次会话中包含多次请求和响应.* 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直 ...

最新文章

  1. 【跃迁之路】【554天】程序员高效学习方法论探索系列(实验阶段311-2018.08.13)...
  2. 使用cookie解决微信不能存储localStorage的问题
  3. 15丨基础篇:Linux内存是怎么工作的?
  4. uniapptabbar的高度是多少_【报Bug】uniapp页面底部空出了tabBar的高度
  5. linux+硬盘rd5,Raid磁盘阵列
  6. 【Flink】大数据分析常用去重算法分析『HyperLogLog 篇』
  7. Python爬虫扩展库BeautifulSoup4用法精要
  8. pcre和正则表达式的误点
  9. linux脚本课程设计通讯录,shell整理(35)====模拟用户登录的打印菜单脚本
  10. android 加载过程,Android View (2) View的加载过程
  11. 中国省市区县级行政区划shapefile获取方法
  12. 【C语言实现】goto语句实现简易关机程序
  13. Fiddler设置服务代理后手机不能上网的问题
  14. HTML中字体相关单位
  15. ibeacon的实现,广播数据解析
  16. [2021首届“陇剑杯”网络安全大赛 决赛]内存取证writeup
  17. 信号包络及其提取方法(Matlab)
  18. 使用OpenSSL生成/签发证书的原理、流程与示例
  19. 再见,南邮!别了,南京!
  20. android能播放4k视频格式,安卓APP,无广告支持多种格式的万能视频播放器

热门文章

  1. 番茄助手(Visual Assist X)过期的应对方法
  2. 一文搞懂 Cocos Creator 3.0 坐标转换原理
  3. EGM2008-地球重力场
  4. DRM系列(1)之DUMB BUFFER
  5. 发光强度、亮度、光照度,这些不常见的单位傻傻分不清?
  6. ubuntu 内存清理【亲测有效】
  7. java实现阿里云OSS上传下载
  8. 互联网行业职位介绍——PM,RD,FE,UE,UI,QA,OP,DBA,BRD,MRD, PRD,FSD等
  9. 深度暗色调色效果Lr预设
  10. 干货分享|PRD 模板