boa服务器如何运行cgi,BOA服务器与CGI-程序员宅基地

技术标签: boa服务器如何运行cgi  

在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的B/S结构,即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器,能够生成动态页面,在用户端只需要通过Web浏览器就可以对嵌入式设备进行管理和监控,非常方便实用。本文主要介绍BOA服务器和CGI的工作原理。

一、BOA服务器

1.嵌入式WEB服务器常见的有lighttpd、shttpd、thttpd、boa、mathopd、minihttpd、appweb、goahead等,本文主要介绍BOA服务器。

它是一个非常小巧的服务器,执行代码大约60KB左右,是一个运行于unix或linux下的,支持CGI的、适合于嵌入式系统的单任务的http服务器,源代码开放、性能高。由于它是一个单任务的web服务器,只能一次完成用户的请求,而不会fork出新的进程来处理并发的链接请求。但是BOA支持CGI,能够为CGI程序fork出一个进程来执行相应的客户请求。它的主要功能是在互联嵌入式设备之间进行信息交互,达到通过网络对嵌入式设备进行监控,并将反馈信息自动上传给主控设备的目的。它是基于HTTP超文本传输协议的,Web网页是Web服务基本的传输单元。嵌入式Web服务的工作基于客户机/服务器计算模型,由Web浏览器(客户机)和Web服务器(服务器)构成,也即著名的B/S结构。运行于客户端的浏览器首先要与嵌入式Web服务器BOA端建立连接,打开一个套接字虚拟文件,此文件建立标志着SOCKET连接建立成功然后客户端浏览器通过套接字SOCKET以GET或者POST参数传递方式向Web服务器提交请求,Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到请求后,根据请求的不同进行事务处理,返回HTML文件或者通过CGI调用外部应用程序,返回处理结果。服务器通过CGI与外部应用程序和脚本之间进行交互,根据客户端浏览器在请求时所采用的方法,服务器会搜集客户所提供的信息,并将该部分信息发送给指定的CGI扩展程序,CGI扩展程序进行信息处理并将结果返回给服务器,然后服务器对信息进行分析,并将结果发送回客户端在浏览器上显示出来。

2.服务器客户端之间的通信,是客户端的浏览器和服务器端的http服务器之间的HTTP通信,我们只需要知道浏览器请求执行服务器上哪个CGI程序就可以了,其他不必深究细节,以为这些过程不需要程序员去操作。服务器和CGI程序之间的通信才是我们关注的。

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

(1)服务器将URL指向一个应用程序

(2)服务器为应用程序执行做准备

(3)应用程序执行,读取标准输入输出和有关环境变量

(4)应用程序进行标准输出

注:对于Windows系统而言,还可以通过profile文件进行数据传输

更通俗点讲,网页里面有个变量(环境变量),变量里面有个值, 通过某种方式把这个值传到 cgi 程序中, cgi 程序中提取这个变量的值,根据这个值做出相应的处理;那么这个变量是怎么在从网页传到 cgi 程序的呢?

3.在HTML中,当客户填写了表单,并按下了发送(submit)按钮后,表单的内容被发送到了服务器端,一般的,这时就需要有一个服务器端脚本来对表单的内容进行一些处理,或者是把它们保存起来,或者是按内容进行一些查询,或者是一些别的什么。没有了 CGI,WEB 的世界就完全失去了它的交互性,所有的信息都变成单向的了,而不能够有任何的反馈。这里就要说到表单了:

表单是html中

这个标签的翻译,在网页中主要负责数据采集功能。

一个表单有三个基本组成部分:表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。 表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。这些东西只要打开 dreamweaver 随便建个 html 就可以看到它的表单元素; 当你打开一个网页的时候,你输入的文字或者做出的选择,类似等等要提交信息的地方基本上都是属于表单元素; 这些表单元素(表单项)都必须放在表单内, 而整个表单在网页是看不到的,你可以理解它为一个容器,里面装着你要发给服务器的东西。

由于 HTML 只能显示静态网页,无法和服务器活动数据进行交互,所以要通过表单与服务器互动; 就跟你去银行办业务,人家要你在表上填一堆东西,然后把表提交给业务员,那个表就是表单, 网站表单类似这种包含了许多用户填写的信息,提交给服务器,服务器获取填写的信息后执行相应操作。

图为html文件中的一个代码段,这就是表单的提交过程

f11a0ab39a1e21781274ac351eabd2c5.png

这里的“submit”即为表单内容,里面的数据会被提交到指定 URL(这个 url 可以是服务器上的一个 cgi程序,此处即为login.cgi)。

URL:统一资源定位符(Uniform Resource Locator,URL)是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

4.在此处也简单的提一下网页

网页是一个纯文本文件,是向浏览者传递信息的载体,以超文本和超媒体为技术,采用HTML、CSS、XML等语言来描述组成页面的各种元素,包括文字、图像、音乐等,并通过客户端浏览器进行解析,从而向浏览器呈现网页的各种内容。做好的网页放在BOA服务器的WWW文件里,客户端浏览器对哪个网页有请求服务器就把哪个页面发送给浏览器。

二、CGI

CGI即通用网关接口(Common Gateway Interface),是一个 Web 服务器主机提供信息服务的标准接口。通过CGI 接口,Web 服务器就能够获取客户端提交的信息,转交给服务端的CGI 程序进行处理,后返回结果给客户端。组成 CGI 通信系统的是两部分:一部分是 html 页面,就是在用户端浏览器上显示的页面。另一部分则是运行在服务器上的 Cgi 程序。它们之间的通讯方式如下图:

f2bb72c28d00e0c770747f618510de4a.png

客户端(网页)发送表单信息给服务器,服务器去调用CGI,CGI通过服务器将反馈信息发给客户端,客户端浏览器对信息进行解析并显示。

CGI程序被用来解释处理来自表单的输入信息,并在服务器产生相应的处理,或将相应的信息反馈给浏览器。CGI使网页不再是静态的,而是具有交互功能。到时做好的 cgi 程序放在服务器 www/cgi-bin 里面,cgi 程序不能跳出 www文件夹取其他文件夹的资源。

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

13-1F411092TXc.png

有了表单,知道表单项中有个按钮点一下就可以提交表单了, 那么这个表单是怎么提交到服务器上面的?

上面那个代码段中 method 中的 get 和 post 就是提交表单的两种方式;

GET: 对于那些使用了属性“METHOD=GET”的表单(或者没有 METHOD 属性,这时候 GET 是其缺省值),CGI 定义为:当表单被发送到服务器断后,表单中的数据被保存在服务器上一个叫做 QUERY_STRING 的环境变量中。这种表单的处理相对简单,只要读取环境变量就可以了。

POST:对于 POST 类型的表单,其内容被送到 CGI 程序的标准输入(在 C 语言中是stdin),而被传送的长度被放在环境变量 CONTENT_LENGTH 中。因而我们要做的就是,在标准输入中读入 CONTENT_LENGTH 长度的字符串。从标准输入读入数据听起来似乎要比从环境变量中读数据来的要容易一些,其实则不然,有一些细节地方要注意,这在下面的程序中可以看到。特别要注意的一点就是:CGI 程序和一般的程序有所不同,一般的程序在读完了一个文件流的内容之后,会得到一个EOF标志。但在 CGI 程序的表单处理过程中,EOF 是永远不会出现的,所以千万不要读多于 CONTENT_LENGTH 长度的字符,否这会有什么后果,谁也不知道。

两种表单提交方式之间的区别:

以GET方式接收的数据是有长度限制,而用POST 方式接收的数据是没有长度限制的。并且,以GET方式发送数据,可以通过URL的形式来发送,但POST方式发送数据必须要通过Form才到发送。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39855568/article/details/119230627

智能推荐

浅谈关于文档碎片的理解_文档碎片的作用-程序员宅基地

文章浏览阅读2k次。好好学习 ,天天向上。Are you ready?1、js操作dom时发生了什么?每次对dom的操作都会触发"重排",这严重影响到能耗,一般通常采取的做法是尽可能的减少dom操作来减少"重排"。2、什么是文档碎片?document.createDocumentFragment()一个容器,用于暂时存放创建的dom元素(其实这个跟咱们上课说那个先让到一个元素中,然后最后appendchil..._文档碎片的作用

C#操作Access数据库(vs2019)_c# access-程序员宅基地

文章浏览阅读2.4w次,点赞20次,收藏186次。C#操作Access数据库(vs2019)一、数据库连接与编程实现1、创建Access数据库2.数据库与C#建立连接3.编程实现数据库的读取2)代码部分二、数据库的操作1、在数据库某一表中增加一行数据。2、修改某一个数据的值3.查找数据表中某一字段中的数据对应的那一行数据4.在数据库中创建新表一、数据库连接与编程实现1、创建Access数据库1)打开Office Access新建一个空白数据库DATA.accdb,并改好存放位置。2)根据自己需要建立一个新表,命名为表1;并在表内添加自己需要的列表数_c# access

HDU 4500 小Q系列故事――�丝的逆袭-程序员宅基地

文章浏览阅读1.8k次。毕业于普通本科的小Q一直自称是资深�丝,不仅学校不知名,甚至他自己在这个普通学校也是默默无闻――直到临近毕业的时候,班里5朵金花中的2位甚至从没和他说过话!  谁又能想到,如此不起眼的小Q在历经重重面试环节后,竟然如愿以偿加入了心仪已久的腾讯公司!消息刚刚传开的那几天,这在他们班甚至整个学院都是讨论的热门话题,如果这时候你还表示不知道小Q是谁,你都会被大家当作怪物的。  正所谓野百合也有春

arcgis用python字段自动编号_第024篇:ArcGIS中实现要素的自动编号-程序员宅基地

文章浏览阅读1.5k次。最近又用到这个自动编号功能,所以翻出来了老博客。之前写的太糙了,这次找出来发现连自己都不会用了,这豆腐渣工程鸣谢:一位不轻易透明姓名的大佬儿使用场景:给shp里的要素重新编号。代码实现:给Id字段从1开始以1递增自动编号(一)ArcMap中,打开Python窗口,输入以下代码并按回车运行rows = arcpy.UpdateCursor('D:/New_Shapefile.shp','','','..._arcgis字段从1开始编号

动态、静态库的创建和使用-程序员宅基地

文章浏览阅读47次。1、linux库的概念库是一种软件组件技术,库里面封装了数据和函数,提供给用户程序调用。库的使用可以使程序模块化,提高程序的编译速度,实现代码重用,使程序易于升级。因此,对于软件开发人员,掌握这项技术是十分必要的。window系统本身提供并使用了大量的库,包括静态链接库(.lib)和动态链接库(.dll)。类似的,linux系统也使用库。linux系统中,通常把库文件放在/usr/li..._ar rcs liblib.a mylib.o

C++ 数据结构 给定有向图施工工程规划计算_数据结构 工期-程序员宅基地

文章浏览阅读740次,点赞4次,收藏12次。给定一个工程项目的施工流程图,并给出其每项子工程所需的时间,请设计程序判断该施工进展图能否顺利执行?如果能,需求出完成整项工程所需的最短工期,并给出影响整个工程中的可能影响工期的最关键的子工程是哪些。......_数据结构 工期

随便推点

css实现给Joplin笔记加个目录_joplin 笔记目录-程序员宅基地

文章浏览阅读1w次,点赞2次,收藏3次。nav.table-of-contents ul { list-style-type: none; margin-top: 0px; margin-bottom: 0px; }nav.table-of-contents>ul { top: 5px; right: 0px; z-index: 99; font-size: 12px; position: fixed; padding: 15px; bo_joplin 笔记目录

如何用布尔类型定义性别Java_【Java学习笔记之八】JavaBean中布尔类型使用注意事项...-程序员宅基地

文章浏览阅读1.6k次。JavaBean是一个标准,遵循标准的Bean是一个带有属性和getters/setters方法的Java类。JavaBean的定义很简单,但是还有有一些地方需要注意,例如Bean中含有boolean类型的属性。我们知道对于一个属性来说,如果其命名为test,那么其getter和setter方法一般为getTest()和setTest。但是如果test为一个布尔类型,那么其getter和sette..._boolean类型的性别如何在javabeen中

小白到架构师需要掌握的技能_小白结构师-程序员宅基地

文章浏览阅读158次。从小白到架构师确实需要走很长的路,一是需要自己不断地掌握技能,一是必须有一个能够发挥自己的环境,**实践是证明真理的唯一标准**,的确如此,没有经历活生生的场景,不可能成为一个合格的架构师的。首先非常抱歉本片文章只能抛砖引玉,由于涉及到知识面非常多,不可能一一描述清楚请谅解(在后面的日子里只能逐个详解)。**做技术的必须做好负重前行的准备,这样才能带来岁月静好的时光!** *感谢技术部所有..._小白结构师

mixin机制 vue_Vue的mixin机制及mergeOptions解析-程序员宅基地

文章浏览阅读189次。前言Mixin 也就是混入的意思,就是说通过某种方式将一个对象的一些属性,混入到目标对象身上。对于我个人来说,其实并不太喜欢 Mixin 这是方式的,因为它对开发者来说是透明的,我们不知道什么时候同事去绑定了一个全局的 Mixin,当然用的好那肯定是不方便的,也无奈 Vue 的 Mixin 机制那么强大,所以就驱使我来深入了解它。startmixin 方法在src/core/global-api下..._mixin文件打包后是怎样的

浅谈vue 2.0中的虚拟dom概念_vue虚拟dom是什么,为啥要使用它-程序员宅基地

文章浏览阅读2.4k次。浅谈vue 2.0中的虚拟dom概念概要主要内容虚拟DOM实现概要作者一直很在意new Vue({ router, render: h => h(App) }).$mount('#app');中render函数的用意,一开始以为只是单纯的把dom树渲染上去,但去官网查阅巩固后,发现虚拟DOM的用意。其实我们平时写的组件也是以虚拟dom的形式渲染上你的网页的。首先,我们知道原生的js中,无..._vue虚拟dom是什么,为啥要使用它

【JS】亲密字符串 #字符串-程序员宅基地

文章浏览阅读254次。给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。输入: A = “ab”, B = “ba” , 输出: true输入: A = “ab”, B = “ab” , 输出: false输入: A = “aa”, B = “aa” , 输出: true输入: A = “aaaaaaa...