学习CGI脚本(脚本)CGI 意思为 Common Gateway Interface,
一种基于浏览器的输入、在Web服务器上运维的次序方法. CGI脚本
让你的浏览器与用户能相互,为了在数据库中找出一个名词,
提供你写入的评价,或者从二个表单中选取多少个条目款项何况能博得叁个明明的回答.
要是你已经碰着过在web上填表或开始展览搜寻, 你即使用的CGI脚本.
你当时只怕未有发掘到,因为大多数行事是在服务器上运营的,你见到的只是结果.

主机景况:RedHat9

什么是 CGI?

国有网关接口(CGI),是一套标准,定义了音讯是何许在 Web
服务器和客户端脚本之间开始展览置换的。

CGI 规范近日是由 NCSA 维护的,NCSA 定义 CGI 如下:

  • 公物网关接口(CGI),是一种用于外界网关程序与新闻服务器(如 HTTP
    服务器)对接的接口标准。
  • 时下的本子是 CGI/1.1,CGI/1.2 版本正在推动中。

什么是 CGI?

  • 集体网关接口(CGI),是一套标准,定义了信息是何等在 Web
    服务器和客户端脚本之间举办置换的。
  • CGI 标准近期是由 NCSA 维护的,NCSA 定义 CGI 如下:
  • 国有网关接口(CGI),是一种用于外界网关程序与音讯服务器(如 HTTP
    服务器)对接的接口标准。
  • 脚下的版本是 CGI/1.1,CGI/1.2 版本正在推进中。
  • 国有网关接口(CGI),是驱动应用程序(称为 CGI 程序或 CGI
    脚本)能够与 Web 服务器以及客户端实行互相的标准协议。那一个 CGI
    程序能够用 Python、PE揽胜L、Shell、C 或 C++ 等开始展览编辑。

用作一个网页设计者, 你创制客户端的 CGI脚本,
服务器端的顺序用来管理用户输入, 结果重临给用户.

交叉编写翻译器:arm-linux-gcc version 4.3.2

Web 浏览

为了更加好地问询 CGI 的定义,让大家点击叁个超链接,浏览三个一定的网页或
U翼虎L,看看会发生什么。

你的浏览器联系上 HTTP Web 服务器,并恳求 U福睿斯L,即文件名。

Web 服务器将解析 U帕杰罗L,并查找文件名。假诺找到伏乞的文书,Web
服务器会把文件发送回浏览器,不然发送一条错误音讯,评释你央浼了一个荒谬的文件。

Web 浏览器从 Web
服务器获取响应,并依赖接收到的响应来突显文件或错误音信。

可是,以这种方法搭建起来的 HTTP
服务器,不管曾几何时诉求目录中的某些文件,HTTP
服务器发送回来的不是该公文,而是以程序格局进行,并把施行产生的输出发送回浏览器展现出来。

公家网关接口(CGI),是驱动应用程序(称为 CGI 程序或 CGI 脚本)能够与
Web 服务器以及客户端实行交互的标准协议
。那么些 CGI 程序能够用
Python、PESportageL、Shell、C 或 C++ 等张开编辑。

Web 浏览

  • 点击一个超链接,浏览三个一定的网页或 U福睿斯L,看看会爆发
    浏览器联系上 HTTP Web 服务器,并央浼 UWranglerL,即文件名。
  • Web 服务器将深入分析 UOdysseyL,并查找文件名。假设找到央浼的文书,Web
    服务器会把公文发送回浏览器,不然发送一条错误音讯,申明你央求了三个谬误的公文。
  • Web 浏览器从 Web
    服务器获取响应,并依据接收到的响应来显示文件或不当消息。

以这种方法搭建起来的 HTTP 服务器,不管哪天诉求目录中的有个别文件,HTTP
服务器发送回来的不是该文件,而是以程序格局举行,并把试行发生的出口发送回浏览器突显出来。

金沙注册送58 1

cgiarch.gif

在那边你将学习有关CGI脚本的整套:

平台:s3c2440

CGI 架构图

下图演示了 CGI 的框架结构:

金沙注册送58 2

CGI 架构

Web 服务器配置

张开 CGI 编制程序从前,请确定保证您的 Web 服务器扶助 CGI,并已安插成能够管理 CGI
程序。
全数由 HTTP 服务器施行的 CGI 程序,都必须在预配置的目录中。
该目录称为 CGI 目录,根据常规命名叫 /var/www/cgi-bin。
即使 CGI 文件是 C++ 可实施文件,可是依据常规它的恢弘名是 .cgi。

默许景况下,Apache Web 服务器会计划在 /var/www/cgi-bin 中运作 CGI
程序。假使想内定别的目录来运行 CGI 脚本,可以在 httpd.conf
文件中期维修改以下一些:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>

<Directory "/var/www/cgi-bin">
Options All
</Directory>
  • CGI脚本是哪些?它是哪些工作的
  • 三个CGI脚本输出象什么?
  • 哪些用参数或无参数创制多少个CGI脚本
  • 怎么创制贰个回来规定响应的CGI脚本
  • 什么制造一个输入表单的CGI脚本
  • 关于在动用CGI脚本中的难题
  • 你能在剧本中使用的CGI变量

(一)           编译boa

Web 服务器配置

在你举行 CGI 编制程序在此以前,请确定保障您的 Web 服务器辅助 CGI,并已布局成能够拍卖
CGI 程序。全部由 HTTP 服务器试行的 CGI
程序,都无法不在预配置的目录中。该目录称为 CGI 目录,遵照常规命名称叫/var/www/cgi-bin。尽管 CGI 文件是 C++
可实施文件,但是依照惯例它的恢弘名是 .cgi。

暗中同意景况下,Apache Web 服务器会布署在 /var/www/cgi-bin 中运作 CGI
程序。如若你想内定其余目录来运行 CGI 脚本,您能够在 httpd.conf
文件中期维修改以下一些:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>

<Directory "/var/www/cgi-bin">
Options All
</Directory>

在那边,大家只要已经安顿好 Web 服务器并能成功运行,你可以运转放肆的 CGI
程序,举个例子 Perl 或 Shell 等。

第一个 CGI 程序

#include <iostream>
using namespace std;

int main ()
{
    //把它的输出写在 STDOUT 文件上,即显示在屏幕上
   cout << "Content-type:text/html\r\n\r\n";//这一行发送回浏览器,并指定要显示在浏览器窗口上的内容类型
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Hello World - 第一个 CGI 程序</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<h2>Hello World! 这是我的第一个 CGI 程序</h2>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

编写翻译上边的代码,把可施行文件命名称叫 cplusplus.cgi,并把那几个文件保留在
/var/www/cgi-bin 目录中。在运转 CGI 程序在此以前,请使用 chmod 755
cplusplus.cgi UNIX 命令来修改文件形式,确定保障文件可实行。

必须精通 CGI 的基本概念,那样技能越发应用 Python 编写越多复杂的 CGI
程序。C++ CGI 程序能够与其他其它外界的种类(如 WranglerDBMS)实行交互。


从Boa的官网 web服务器在Linux2,不错的一篇学习CGI脚本。
上下载了它的发行版本源码,版本号为0.94.13。先把源码解压,调出超级终端并进行:

第一个 CGI 程序

请看上面包车型大巴 C++ 程序:

#include <iostream>
using namespace std;

int main ()
{

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>Hello World - 第一个 CGI 程序</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<h2>Hello World! 这是我的第一个 CGI 程序</h2>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

编写翻译下面的代码,把可施行文件命名字为 cplusplus.cgi,并把那些文件保留在
/var/www/cgi-bin 目录中。在运作 CGI 程序在此以前,请使用 chmod 755
cplusplus.cgi UNIX
命令来修改文件方式,确认保障文件可实践。访谈可实施文件,您拜见到上面包车型客车输出:

Hello World! 这是我的第一个 CGI 程序

地方的 C++ 程序是五个简短的先后,把它的出口写在 STDOUT
文件上,即体未来荧屏上。在此处,值得注意一点,第一行输出
Content-type:text/html\r\n\r\n。这一行发送回浏览器,并点名要显示在浏览器窗口上的从头到尾的经过类型。

你必须清楚 CGI 的基本概念,那样技巧更上一层楼行使 Python 编写越多复杂的 CGI
程序。C++ CGI 程序能够与其余另外外界的连串(如 TiguanDBMS)举办彼此。

HTTP 头信息

行 Content-type:text/html\r\n\r\n 是 HTTP
头音信的组成都部队分,它被发送到浏览器,以便越来越好地理解页面内容。HTTP
头新闻的格局如下:

HTTP 字段名称: 字段内容

例如
Content-type: text/html\r\n\r\n
头信息 描述
Content-type: MIME 字符串,定义返回的文件格式。例如 Content-type:text/html。
Expires: Date 信息变成无效的日期。浏览器使用它来判断一个页面何时需要刷新。一个有效的日期字符串的格式应为 01 Jan 1998 12:00:00 GMT。
Location: URL 这个 URL 是指应该返回的 URL,而不是请求的 URL。你可以使用它来重定向一个请求到任意的文件。
Last-modified: Date 资源的最后修改日期。
Content-length: N 要返回的数据的长度,以字节为单位。浏览器使用这个值来表示一个文件的预计下载时间。
Set-Cookie: String 通过 string 设置 cookie。

本章节如果在UNIX系统下的。

# tar xzf boa-0.94.13.tar.gz

HTTP 头信息

行 Content-type:text/html\r\n\r\n 是 HTTP
头音讯的组成都部队分,它被发送到浏览器,以便越来越好地驾驭页面内容。HTTP
头音信的款式如下:

HTTP 字段名称: 字段内容
例如

Content-type: text/html\r\n\r\n

还会有一点点别的的严重性的 HTTP 头消息,这几个在您的 CGI 编制程序中都会时常被用到。

头信息 描述
Content-type: MIME 字符串,定义重临的文件格式。举例

Content-type:text/html。
Expires: Date |
消息改为无效的日期。浏览器选拔它来推断二个页面何时需求刷新。二个得力的日期字符串的格式应该为01 Jan 1998 12:00:00 欧霉素T。
Location: U奥迪Q5L | 那个 U科雷傲L 是指应该回到的 UGL450L,并非呼吁的
UCRUISERL。你能够使用它来重定向一个伸手到自由的文书。
Last-modified: Date | 能源的最终修改日期。
Content-length: N |
要回去的数指标长度,以字节为单位。浏览器选用那些值来代表贰个文书的估摸下载时间。
Set-Cookie: String | 通过 string 设置 cookie。

CGI 情况变量

具有的 CGI 程序都可以访谈下列的蒙受变量。

变量名 描述
CONTENT_TYPE 内容的数据类型。当客户端向服务器发送附加内容时使用。例如,文件上传等功能。
CONTENT_LENGTH 查询的信息长度。只对 POST 请求可用。
HTTP_COOKIE 以键 & 值对的形式返回设置的 cookies。
HTTP_USER_AGENT 用户代理请求标头字段,递交用户发起请求的有关信息,包含了浏览器的名称、版本和其他平台性的附加信息。
PATH_INFO CGI 脚本的路径。
QUERY_STRING 通过 GET 方法发送请求时的 URL 编码信息,包含 URL 中问号后面的参数。
REMOTE_ADDR 发出请求的远程主机的 IP 地址。这在日志记录和认证时是非常有用的。
REMOTE_HOST 发出请求的主机的完全限定名称。如果此信息不可用,则可以用 REMOTE_ADDR 来获取 IP 地址。
REQUEST_METHOD 用于发出请求的方法。最常见的方法是 GET 和 POST。
SCRIPT_FILENAME CGI 脚本的完整路径。
SCRIPT_NAME CGI 脚本的名称。
SERVER_NAME 服务器的主机名或 IP 地址。
SERVER_SOFTWARE 服务器上运行的软件的名称和版本。
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;

const string ENV[ 24 ] = {                 
        "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",   
        "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING",             
        "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION",         
        "HTTP_HOST", "HTTP_USER_AGENT", "PATH",            
        "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT",      
        "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME",
        "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN",      
        "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",     
        "SERVER_SIGNATURE","SERVER_SOFTWARE" };   

int main ()
{

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 环境变量</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

   for ( int i = 0; i < 24; i++ )
   {
       cout << "<tr><td>" << ENV[ i ] << "</td><td>";
       // 尝试检索环境变量的值
       char *value = getenv( ENV[ i ].c_str() );  
       if ( value != 0 ){
         cout << value;                                 
       }else{
         cout << "环境变量不存在。";
       }
       cout << "</td></tr>\n";
   }
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

# cd boa-0.94.13/src

CGI 情状变量

负有的 CGI 程序都得以访谈下列的情状变量。这一个变量在编排 CGI
程序时扮演了充足主要的角色。

变量名 描述
CONTENT_TYPE

剧情的数据类型。当客户端向服务器发送附加内容时接纳。举个例子,文件上传等功用。
CONTENT_LENGTH | 查询的音信长度。只对 POST 乞求可用。
HTTP_组长KIE | 以键 & 值对的样式重临设置的 cookies。
HTTP_USER_AGENT |
用户代理诉求标头字段,递交用户发起呼吁的关于音信,包蕴了浏览器的称号、版本和其余平台性的叠合新闻。
PATH_INFO | CGI 脚本的门路。
QUERY_STEscortING | 通过 GET 方法发送央求时的 U福睿斯L 编码音信,满含 U中华VL
中问号前面的参数。
REMOTE_ADD奥迪Q7 | 发出须求的长途主机的 IP
地址。那在日记记录和表达时是老大低价的。
REMOTE_HOST | 发出央浼的主机的通通限定名称。假设此音信不可用,则能够用
REMOTE_ADDR来获取 IP 地址。
REQUEST_METHOD | 用于发出乞请的秘籍。最分布的章程是 GET 和 POST。
SCRIPT_FILENAME | CGI 脚本的完整路线。
SCRIPT_NAME | CGI 脚本的名号。
SERVER_NAME | 服务器的主机名或 IP 地址。
SERVER_SOFTWARE | 服务器上运转的软件的名目和本子。

下边包车型大巴 CGI 程体系出了全体的 CGI 变量。

#include <iostream>
#include <stdlib.h>
using namespace std;

const string ENV[ 24 ] = {                 
        "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",   
        "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING",             
        "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION",         
        "HTTP_HOST", "HTTP_USER_AGENT", "PATH",            
        "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT",      
        "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME",
        "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN",      
        "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",     
        "SERVER_SIGNATURE","SERVER_SOFTWARE" };   

int main ()
{

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 环境变量</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

   for ( int i = 0; i < 24; i++ )
   {
       cout << "<tr><td>" << ENV[ i ] << "</td><td>";
       // 尝试检索环境变量的值
       char *value = getenv( ENV[ i ].c_str() );  
       if ( value != 0 ){
         cout << value;                                 
       }else{
         cout << "环境变量不存在。";
       }
       cout << "</td></tr>\n";
   }
   cout << "</table><\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

C++ CGI 库

此间有三个专为 C++ 程序而编写的 CGI 库,能够从
ftp://ftp.gnu.org/gnu/cgicc/
上下载这些 CGI 库,并依据下边的步骤安装库:

$tar xzf cgicc-X.X.X.tar.gz 
$cd cgicc-X.X.X/ 
$./configure --prefix=/usr 
$make
$make install

能够点击 C++ CGI Lib
Documentation,查占卜关的库文书档案

CGI脚本是何许?

CGI脚本简单地讲是个运转在Web服务器上的次第, 有浏览器的输入触发.
这一个脚本日常象服务器和系统中别的程序如数据库的大桥。

CGI 脚本难道不是三个当真的剧本?依据你的服务器的支撑,
他们大概是多个编译好的顺序如故批命令文件可能其余可进行的东西.
为了轻松起见,大家统称他们为脚本scripts.


CGI 脚本是别的运营在web服务器上的程序. CGI意思是Common Gateway
Interface。

 


CGI脚本是用下列三种艺术运用的: 作为几个表单的ACTION 或
作为三个页中的直接link。

生成MakeFile文件

C++ CGI 库

在踏踏实实的实例中,您必要通过 CGI 程序施行很多操作。这里有三个专为 C++
程序而编写的 CGI 库,大家得以从
ftp://ftp.gnu.org/gnu/cgicc/
上下载这几个 CGI 库,并根据上面包车型客车步骤安装库:

$tar xzf cgicc-X.X.X.tar.gz 
$cd cgicc-X.X.X/ 
$./configure --prefix=/usr 
$make
$make install

你能够点击 C++ CGI Lib Documentation,查占卜关的库文书档案。

GET 和 POST 方法

当供给从浏览器传递一些消息到 Web 服务器,最终再盛传 CGI 程序。
习认为常浏览器会动用两种艺术把那个消息传播 Web 服务器,分别是 GET 和 POST
方法。

CGI脚本是何等专门的学业的?

CGI脚本有服务器调用, 基于浏览器的数据输入. 图1
突显在浏览器、服务器松阳高腔本之间是哪些的五个流程.

图1.
从浏览器到服务器到脚本到程序
记住再回到噢!

那有个大约的暗暗提示解释:

  1. 一个U昂科拉L指向叁个CGI脚本.
    叁个CGI脚本的UEnclaveL能如一般的UWranglerL同样在其他地点出现。
  2. 服务器收到央浼,
    依据这些ULX570L指向的脚本文件(注意文件的岗位和扩张名),试行脚本.
  3. 剧本试行基于输入数据的操作,满含查询数据库、计算数值或调用系统中别的程序.
  4. 本子爆发某种Web服务器能领会的输出结果.
  5. 服务器收到来自脚本的出口何况把它传播浏览器,让用户理解结果。

#./configure

GET 和 POST 方法

你或然有遭逢过那样的情形,当您要求从浏览器传递一些新闻到 Web
服务器,最终再传播 CGI 程序。平常浏览器会利用三种办法把这几个消息传播 Web
服务器,分别是 GET 和 POST 方法。

行使 GET 方法传递消息

GET 方法发送已编码的用户消息追加到页面乞求中。页面和已编码音讯透过 ?
字符分隔开分离

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

GET 方法是默许的从浏览器向 Web
服务器传信息的章程,它会在浏览器的地点栏中生成一串相当短的字符串。当向服务器传密码或别的一些乖巧音讯时,不要采用GET 方法。GET 方法有高低限制,在三个诉求字符串中最多能够传 1024 个字符。

当使用 GET 方法时,是使用 QUERY_STEvoqueING http 头来传递音讯,在 CGI
程序中可采用 QUEEscortY_STOdysseyING 情状变量来拜见。

可以经过在 U奥迪Q7L 后跟上粗略连接的键值对,也足以透过动用 HTML <FORM>
标签的 GET 方法来传音讯。

二个简易的事例

那边详细一步一步地解释全部有关产生的内幕。
在图第22中学有个例图:
图2.
带有二个本子连接的页.

Display Date处是个针对CGI脚本的连接. 它的HTML是那样的:

<A HREF="http://www.popchina.com/cgi-bin/getdate">Display the Date</A>

证实是个CGI脚本是因为那其间有个cgi-bin的路线.
在相当多服务器cgi-bin是仅能够放置CGI脚本的目录.

当你选用那么些再而三时, 你的浏览器将向www.popchina.com服务器提出需要.
服务器收到那一个央浼总括出U翼虎L处的本子文件名然后举办这些脚本.

以此getdate脚本, 在UNIX系统中实践是这般的:

#!/bin/sh


echo Content-type: text/plain


echo


/bin/date

先是行是个新鲜的下令,告诉UNIX系统那是个shell脚本;
真实的情形是从那行开端的下一行,那么些剧本做两件事:它输出游Content-type:
text/plain, 接着先导二个空行;第二, 它调用UNIX系统时间date程序,
那样输出日期和时间. 脚本施行后输出应该如此:

Content-type: text/plain


Tue Oct 25 16:15:57 EDT 1994

其一Content-type是如杨刚东?它是个独树一帜的编码,Web服务器用来报告浏览器输出那个文件是什么样品种的.
那与HTML中Content-type含义是同样的。

如此那般浏览器的出口就好像图3.

图3
date脚本输出结果.

那是最基本的,实际处境要复杂得多,同理可得能够用来掌握浏览器、服务器黄岩乱弹本之间是怎么工作的。

修改Makefile文件,找到CC=gcc,将其改成CC=arm-linux-gcc,再找到CPP = gcc
-E,将其改成CPP = arm-linux-gcc -E,并保留退出。

行使 GET 方法传递新闻

GET 方法发送已编码的用户音信追加到页面诉求中。页面和已编码音信经过 ?
字符分隔开分离,如下所示:

http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

GET 方法是暗许的从浏览器向 Web
服务器传新闻的艺术,它会在浏览器的地点栏中生成一串不短的字符串。当你向服务器传密码或别的部分乖巧音讯时,不要采纳GET 方法。GET 方法有大大小小限制,在贰个伸手字符串中最多可以传 1024 个字符。

当使用 GET 方法时,是使用 QUERY_ST昂科拉ING http 头来传递新闻,在 CGI
程序中可选用 QUELX570Y_ST卡宴ING 景况变量来访谈。

你能够由此在 ULX570L 后跟上粗略连接的键值对,也足以通过使用 HTML
<FORM> 标签的 GET 方法来传音讯。

简单的 URL 实例:Get 方法

上面是三个简便的 ULacrosseL,使用 GET 方法传递三个值给 hello_get.py 程序。

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

下边包车型地铁实例生成 cpp_get.cgi CGI 程序,用于拍卖 Web
浏览器给出的输入。通过选拔 C++ CGI 库,能够很轻便地拜见传递的音讯:

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>  

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>使用 GET 和 POST 方法</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "名:" << **fi << endl;  
   }else{
      cout << "No text entered for first name" << endl;  
   }
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "姓:" << **fi << endl;  
   }else{
      cout << "No text entered for last name" << endl;  
   }
   cout << "<br/>\n";

   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

生成 cpp_get.cgi,并把它身处 CGI
目录中,并尝试使用上边包车型客车链接举行采访:
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
那会生出以下结果:

名:ZARA 
姓:ALI 

我能用CGI脚本吗?

在您采用CGI脚本在此以前,有两件事你恐怕要消除:CGI脚本
是个高端的Web个性何况供给您和Web  服务器管理者一样好的知识。

没有疑问啊?正是做不到,学学也可以?可以吗!让大家继续.

下一场运营make实行编写翻译,那时出现如下错误:

简单的 URL 实例:Get 方法

下边是二个简便的 ULANDL,使用 GET 方法传递多少个值给 hello_get.py 程序。

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

上面包车型地铁实例生成 cpp_get.cgi CGI 程序,用于拍卖 Web
浏览器给出的输入。通过应用 C++ CGI 库,能够很轻松地探望传递的音讯:

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>  

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>使用 GET 和 POST 方法</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("first_name");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "名:" << **fi << endl;  
   }else{
      cout << "No text entered for first name" << endl;  
   }
   cout << "<br/>\n";
   fi = formData.getElement("last_name");  
   if( !fi->isEmpty() &&fi != (*formData).end()) {  
      cout << "姓:" << **fi << endl;  
   }else{
      cout << "No text entered for last name" << endl;  
   }
   cout << "<br/>\n";

   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

现行,编写翻译上面包车型地铁主次,如下所示:

$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc

生成 cpp_get.cgi,并把它献身 CGI 目录中,并尝试运用上边包车型地铁链接举行拜谒:

/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI

那会发生以下结果:

名:ZARA 
姓:ALI 

粗略的表单实例:GET 方法

上面是二个归纳的实例,使用 HTML 表单和交给按键传递多少个值。将应用同样的
CGI 脚本 cpp_get.cgi 来拍卖输入。

<form action="/cgi-bin/cpp_get.cgi" method="get">
名:<input type="text" name="first_name">  <br />

姓:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>

你的服务器配置允许CGI脚本吗?

为了能写和平运动作CGI脚本, 你必要一个Web服务器. 不象平时的HTML文件,
你不可能在地面系统上写或考试你的CGI脚本; 你得经过Web服务器来做那么些.

可是即便你有叁个Web服务器, 那几个服务器必须非常地为运转CGI脚本配置一下.
那表示你具有的剧本必须放置在多个称作cgi-bin的目录下.

在编写CGI脚本此前, 询问您的服务器管理者是还是不是允许你安装和平运动作CGI脚本,
而且借使得以的话,他们不能够不放置在哪儿?还也许有,你必须有个实在的Web服务器,假使是FTP或Gopher服务器,那您就不可能用CGI.

若是你在和睦的服务器上运营,
你无法不特别地开创三个叫cgi-bin的目录,并配置你的服务器认同那么些目录为一个本子目录.
也不能够不记住下边关于CGI脚本特点:

  • 每一种脚本是个程序, 它运转在浏览器能够乞求的系统上,
    施行时利用CPU时间和内部存款和储蓄器.
    如若成功打上千的这一个本子同不经常间运转,会如何?你的系统将不忍负载直至崩溃。
  • 如若您不过细地编写你的CGI脚本,
    你将有希望让旁人通过你的CGI脚本参数步入伤害你的系统.

“ util.c: 100: 1: pasting “t” and “->” does not give   valid
preprocessing token make ”的失实提醒,

简简单单的表单实例:GET 方法

下边是叁个轻便易行的实例,使用 HTML
表单和提交开关传递多少个值。我们将利用同样的 CGI 脚本 cpp_get.cgi
来管理输入。

<form action="/cgi-bin/cpp_get.cgi" method="get">
名:<input type="text" name="first_name">  <br />

姓:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>

上面是上述表单的实际出口,请输入名和姓,然后点击提交开关查看结果。

应用 POST 方法传递新闻

贰个更保证的向 CGI 程序传递音信的法子是 POST 方法
艺术打包音讯的主意与 GET 方法一致
不相同的是,它不是把音讯以文本字符串方式放在 U奇骏L 中的 ?
之后进展传递,而是把它以单身的新闻形式举行传递。该音信是以专门的学问输入的款式传给
CGI 脚本的。

<form action="/cgi-bin/cpp_get.cgi" method="post">
名:<input type="text" name="first_name"><br />
姓:<input type="text" name="last_name" />

<input type="submit" value="提交" />
</form>

您会编制程序吗?

初学者注意! 一般地,
你不能不持有点基本编制程序概念与措施。你必须有临近系统办事的阅历。要是您从未那一个背景,
你必须去上学,好了,费话相当的少说.

改动 compat.h 文件:

行使 POST 方法传递音信

三个更保障的向 CGI 程序传递信息的不二等秘书籍是 POST
方法。这种艺术打包消息的形式与 GET
方法一样,不相同的是,它不是把音讯以文本字符串格局放在 UPAJEROL 中的 ?
之后张开传递,而是把它以单独的新闻格局进行传递。该音讯是以正规化输入的花样传给
CGI 脚本的。

我们一致接纳 cpp_get.cgi 程序来管理 POST
方法。让我们以一样的事例,通过使用 HTML
表单和提交按键来传递五个值,只不过这一次我们接纳的不是 GET 方法,而是 POST
方法,如下所示:

<form action="/cgi-bin/cpp_get.cgi" method="post">
名:<input type="text" name="first_name"><br />
姓:<input type="text" name="last_name" />

<input type="submit" value="提交" />
</form>

向 CGI 程序传递复选框数据

HTML 代码实例是叁个含有八个复选框的表单:

<form action="/cgi-bin/cpp_checkbox.cgi" 
         method="POST" 
         target="_blank">
<input type="checkbox" name="maths" value="on" /> 数学
<input type="checkbox" name="physics" value="on" /> 物理
<input type="submit" value="选择学科" />
</form>

上边包车型客车 C++ 程序会生成 cpp_checkbox.cgi 脚本,用于拍卖 Web
浏览器通过复选框给出的输入。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
   bool maths_flag, physics_flag;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递复选框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   maths_flag = formData.queryCheckbox("maths");
   if( maths_flag ) {  
      cout << "Maths Flag: ON " << endl;  
   }else{
      cout << "Maths Flag: OFF " << endl;  
   }
   cout << "<br/>\n";

   physics_flag = formData.queryCheckbox("physics");
   if( physics_flag ) {  
      cout << "Physics Flag: ON " << endl;  
   }else{
      cout << "Physics Flag: OFF " << endl;  
   }
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

您无法不用什么样编制程序语言?

你可以用你通晓的任何语言编写CGI脚本,
只要你的剧本遵守下一节所列项支出的平整就能够,只要丰富语言能在你的Web服务器系统上运维.

在那本学习手册中,仅用三种语言编写CGI脚本: UNIX shell和 Perl语言.
这些shell是适合在其余类似的UNIX系统上运维何况轻易学习,
可是管理错综相连的气象就不方便了. Perl, 将在用那几个语言了, 它是免费的,
那些语言是牢固和强有力的,类似C,但它也是较难学习的.

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff

向 CGI 程序传递复选框数据

当须求选用三个选项时,我们利用复选框。

下边包车型大巴 HTML 代码实例是三个含有几个复选框的表单:

<form action="/cgi-bin/cpp_checkbox.cgi" 
         method="POST" 
         target="_blank">
<input type="checkbox" name="maths" value="on" /> 数学
<input type="checkbox" name="physics" value="on" /> 物理
<input type="submit" value="选择学科" />
</form>

上边包车型客车 C++ 程序会生成 cpp_checkbox.cgi 脚本,用于拍卖 Web
浏览器通过复选框给出的输入。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;
   bool maths_flag, physics_flag;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递复选框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   maths_flag = formData.queryCheckbox("maths");
   if( maths_flag ) {  
      cout << "Maths Flag: ON " << endl;  
   }else{
      cout << "Maths Flag: OFF " << endl;  
   }
   cout << "<br/>\n";

   physics_flag = formData.queryCheckbox("physics");
   if( physics_flag ) {  
      cout << "Physics Flag: ON " << endl;  
   }else{
      cout << "Physics Flag: OFF " << endl;  
   }
   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

向 CGI 程序传递单选按键数据

上边包车型的士 HTML 代码实例是贰个包括四个单选按键的表单:

<form action="/cgi-bin/cpp_radiobutton.cgi" 
         method="post" 
         target="_blank">
<input type="radio" name="subject" value="maths" 
                                    checked="checked"/> 数学 
<input type="radio" name="subject" value="physics" /> 物理
<input type="submit" value="选择学科" />
</form>

下边的 C++ 程序会生成 cpp_radiobutton.cgi 脚本,用于拍卖 Web
浏览器通过单选按键给出的输入。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递单选按钮数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("subject");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Radio box selected: " << **fi << endl;  
   }

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

您的服务器设置科学了吧?

为了运营任何多个CGI脚本,
不管轻巧或复杂的,你的服务器必须设置成能够运维他们,必须放置在一个一定的目录,必须有贰个依赖你服务器设定的文件扩大名.

一旦您是租用服务器,就要是或不是允许运维CGI脚本.

假使您具有本人的服务器,检查你的服务器表明书是什么样管理CGI脚本的.

改为:

向 CGI 程序传递单选按键数据

当只须要选取一个精选时,大家利用单选按键。

上边包车型大巴 HTML 代码实例是三个涵盖三个单选开关的表单:

<form action="/cgi-bin/cpp_radiobutton.cgi" 
         method="post" 
         target="_blank">
<input type="radio" name="subject" value="maths" 
                                    checked="checked"/> 数学 
<input type="radio" name="subject" value="physics" /> 物理
<input type="submit" value="选择学科" />
</form>

下边包车型客车 C++ 程序会生成 cpp_radiobutton.cgi 脚本,用于拍卖 Web
浏览器通过单选按键给出的输入。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递单选按钮数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("subject");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Radio box selected: " << **fi << endl;  
   }

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

向 CGI 程序传递文本区域数据

上边包车型地铁 HTML 代码实例是三个带有 TEXTAREA 框的表单:

<form action="/cgi-bin/cpp_textarea.cgi" 
         method="post" 
         target="_blank">
<textarea name="textcontent" cols="40" rows="4">
请在这里输入文本...
</textarea>
<input type="submit" value="提交" />
</form>

上边包车型客车 C++ 程序会生成 cpp_textarea.cgi 脚本,用于拍卖 Web
浏览器通过文件区域给出的输入。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递文本区域数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("textcontent");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Text Content: " << **fi << endl;  
   }else{
      cout << "No text entered" << endl;  
   }

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

比如您用的不是UNIX?

只好再找其余学习手册了。

#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff

向 CGI 程序传递文本区域数据

当要求向 CGI 程序传递多行文本时,我们应用 TEXTAREA 成分。

下边包车型客车 HTML 代码实例是一个带有 TEXTAREA 框的表单:

<form action="/cgi-bin/cpp_textarea.cgi" 
         method="post" 
         target="_blank">
<textarea name="textcontent" cols="40" rows="4">
请在这里输入文本...
</textarea>
<input type="submit" value="提交" />
</form>

下边包车型地铁 C++ 程序会生成 cpp_textarea.cgi 脚本,用于拍卖 Web
浏览器通过文件区域给出的输入。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递文本区域数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("textcontent");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Text Content: " << **fi << endl;  
   }else{
      cout << "No text entered" << endl;  
   }

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

向 CGI 程序传递下拉框数据

下边包车型地铁 HTML 代码实例是叁个包罗下拉框的表单:

<form action="/cgi-bin/cpp_dropdown.cgi" 
                       method="post" target="_blank">
<select name="dropdown">
<option value="Maths" selected>数学</option>
<option value="Physics">物理</option>
</select>
<input type="submit" value="提交"/>
</form>

下边包车型大巴 C++ 程序会生成 cpp_dropdown.cgi 脚本,用于拍卖 Web
浏览器通过下拉框给出的输入。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递下拉框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("dropdown");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Value Selected: " << **fi << endl;  
   }

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

解剖五个CGI脚本

即便你编写它十分久,克制重重警戒和配置,恭喜您,你早就能些CGI脚本,並且可以在你的网页上使用了.
在这一章,将学习脚本是如何奉行,你的服务器又是怎么与她们对话发生回应的。

编译成功。

向 CGI 程序传递下拉框数据

当有两个选项可用,但只好选择二个或四个挑选时,我们选择下拉框。

上面的 HTML 代码实例是三个饱含下拉框的表单:

<form action="/cgi-bin/cpp_dropdown.cgi" 
                       method="post" target="_blank">
<select name="dropdown">
<option value="Maths" selected>数学</option>
<option value="Physics">物理</option>
</select>
<input type="submit" value="提交"/>
</form>

上边包车型客车 C++ 程序会生成 cpp_dropdown.cgi 脚本,用于拍卖 Web
浏览器通过下拉框给出的输入。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h> 

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc formData;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>向 CGI 程序传递下拉框数据</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   form_iterator fi = formData.getElement("dropdown");  
   if( !fi->isEmpty() && fi != (*formData).end()) {  
      cout << "Value Selected: " << **fi << endl;  
   }

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

在 CGI 中使用 Cookies

HTTP
协议是一种无状态的商议。但对此二个商业网址,它须求在分歧页面间保持会话音讯。举例,四个用户在完成两个页面包车型地铁步调之后停止注册。可是,如何在颇具网页中保证用户的对话音讯。

在重重情景下,使用 cookies
是记念和追踪有关用户喜好、购买、酬金以及另外为追求更加好的游览者感受或网址总结所需消息的最有效的格局。

输出底部

尽管如此您的CGI脚本能够让您做别的业务,不过脚本的输出如故必须有一个显明方式.


其一 “脚本输出” 意思是指你的脚本发回服务器的数据. 在UNIX系统中,
输出是发向标准输出, 服务器从当年检查评定它. 在任何系统和服务器,
你的剧本输出只怕不一样等了.


那么些底部是实在不是文本的一片段,是服务器与浏览器之间的音信协议,你其实看不到。

有多少个项指标底部: Content-type, Location, 和Status. Content-type
最普及的。

有关content-type解释能够见有关HTML的验证,
三个您可以生出的一定编码象那样:

Content-type: text/html

在那几个事例中,输出数据的门类是text/html; 换句话说, 他是个HTML文件.

 

Format
Content-Type
HTML text/html
Text text/plain
GIF image/gif
JPEG image/jpeg
PostScript application/postscript
MPEG video/mpeg

在意content-type 前边总得跟多个空行.
借使您从未空行,服务器将不能够搞清这几个尾部在哪儿截至。

其它,还供给修改一处src/log.c

在 CGI 中使用 Cookies

HTTP
协议是一种无状态的商业事务。但对于贰个商业网站,它须要在差别页面间保持会话新闻。举个例子,二个用户在形成多少个页面的步子之后甘休注册。可是,如何在具备网页中保持用户的对话音讯。

在十分的多景观下,使用 cookies
是回想和跟踪有关用户喜好、购买、报酬以及其余为追求更加好的游客感受或网址计算所需消息的最实用的办法。

它是什么行事的

服务器以 cookie 的样式向访客的浏览器发送一些多少。假使浏览器接受了
cookie,则 cookie
会以纯文本记录的花样积攒在访客的硬盘上。未来,当访客访谈网址上的另二个页面时,会招来
cookie。一旦找到 cookie,服务器就知道存储了如何。

cookie 是一种纯文本的数额记录,带有 5 个可变长度的字段:

  • Expires : cookie 的超时日期。假诺此字段留空,cookie
    会在访客退出浏览器时过期。
  • Domain : 网址的域名。
  • 帕特h : 设置 cookie
    的目录或网页的门径。假设你想从随机的目录或网页搜索cookie,此字段能够留空。
  • Secure : 假若此字段包罗单词 “secure”,那么 cookie
    只好通过安全服务器举办检索。假如此字段留空,则不设有该限量。
  • Name=Value : cookie 以键值对的款型被设置和收获。

输出数据

您输出的数目应该符合您所规定的content-type; 假使content-type是text/html,
输出安放应该是在HTML. 固然content-type是image/gif,
输出应该是在二个二进制的GIF文件.

    注释掉

金沙注册送58,它是何等专门的学问的

服务器以 cookie 的款型向访客的浏览器发送一些数据。假若浏览器接受了
cookie,则 cookie
会以纯文本记录的形式储存在访客的硬盘上。以往,当访客访谈网址上的另多个页面时,会寻觅cookie。一旦找到 cookie,服务器就知晓存款和储蓄了怎么。

cookie 是一种纯文本的多寡记录,带有 5 个可变长度的字段:

  • Expires : cookie 的超时日期。假设此字段留空,cookie
    会在访客退出浏览器时过期。
  • Domain : 网址的域名。
  • Path : 设置 cookie
    的目录或网页的路径。假诺你想从随机的目录或网页寻找cookie,此字段能够留空。
  • Secure : 固然此字段包蕴单词 “secure”,那么 cookie
    只好通过安全服务器实行检索。就算此字段留空,则不设有该限量。
  • Name=Value : cookie 以键值对的款式棉被服装置和收获。

设置 Cookies

向浏览器发送 cookies 是特别轻便的。这几个 cookies 会在 Content-type
字段在此之前,与 HTTP 头一同被发送。假设想设置 UserID 和 Password 为
cookies,设置 cookies 的步子如下所示:

#include <iostream>
using namespace std;

int main ()
{
 //使用 Set-Cookie HTTP 头来设置 cookies。
//有一些设置 cookies 的属性是可选的,比如 Expires、Domain 和 Path。
//值得注意的是,cookies 是在发送行 "Content-type:text/html\r\n\r\n 之前被设置的。
   cout << "Set-Cookie:UserID=XYZ;\r\n";
   cout << "Set-Cookie:Password=XYZ123;\r\n";
   cout << "Set-Cookie:Domain=www.w3cschool.cc;\r\n";
   cout << "Set-Cookie:Path=/perl;\n";
   cout << "Content-type:text/html\r\n\r\n";

   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   cout << "设置 cookies" << endl;  

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

编写翻译下面的程序,生成 setcookies.cgi,并尝试选拔下边的链接设置
cookies。它会在管理器上安装多少个 cookies:
/cgi-bin/setcookies.cgi

练习1: 小试试.

T那是个大致的输出日期的简便脚本,那个CGI脚本还检查看看本身是不是曾经登入到本人的Web服务器,而且告诉发掘了什么(如在图4).

图4. 脚本的结果
那是个很简短的例子, 他能这么备调用:

<A HREF="http://www.popchina.com/cgi-bin/pinglaura">Is Laura Logged in?</A>

那是不曾输入的本子,它只运转而且重返数据.

依靠前边的阐释,那么些剧本内容是如此::
#!/bin/sh
 

echo Content-type: text/html
 

echo “<HTML><HEAD>”
 

echo “<TITLE>Is Laura There?</TITLE>”
 

echo “</HEAD><BODY>”
为了测验自身是还是不是业已登录系统,用who命令(小编的登录名假使为lemay),
累积结果在变量ison中. 假若本身登录, 变量ison将略微剧情,不不过是空的.

ison='who | grep lemay'

考试结果及再次回到相应提醒的脚本是这么:

if [ ! -z "$ison" ]; then


        echo "<P>Laura is logged in."</P>


else


        echo "<P>Laura isn't logged in."</P>


fi

说起底关闭HTML:

echo "</BODY></HTML>"

当今你通过从命令行运转他,测验一下,你将赢得一个结果说自个儿未登录你的系统,当然不容许的,他的出口是这么的:

Content-type: text/html


<HTML><HEAD>


<TITLE>Are You There?</TITLE>


</HEAD><BODY>


<P>Laura is not logged in.


</BODY></HTML>

那是出口的贰个HTML文本,那样您的浏览器能健康彰显他,因为她是个HTML文件。

 


今日将她copy到你的服务器的cgi-bin目录下,去试行,借使您不可能达到规定的标准CGI-bin目录,你必须询问你的服务器管理者,你不能够自然地和睦树立个CGI-bin目录,那没用的。


这些例子完整的台本如下:

#!/bin/sh

echo "Content-type: text/html"


echo

echo "<HTML><HEAD>"

echo "<TITLE>Is Laura There?</TITLE>"

echo "</HEAD><BODY>"

ison='who | grep lemay'

if [ ! -z "$ison" ]; then

        echo "<P>Laura is logged in"

else

        echo "<P>Laura isn't logged in"

fi

echo "</BODY></HTML>"

  if (dup2(error_log, STDERR_FILENO) == -1) {

设置 Cookies

向浏览器发送 cookies 是特别轻易的。这个 cookies 会在 Content-type
字段从前,与 HTTP 头一同被发送。假如你想设置 UserID 和 Password 为
cookies,设置 cookies 的手续如下所示:

#include <iostream>
using namespace std;

int main ()
{

   cout << "Set-Cookie:UserID=XYZ;\r\n";
   cout << "Set-Cookie:Password=XYZ123;\r\n";
   cout << "Set-Cookie:Domain=www.w3cschool.cc;\r\n";
   cout << "Set-Cookie:Path=/perl;\n";
   cout << "Content-type:text/html\r\n\r\n";

   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   cout << "设置 cookies" << endl;  

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

从那么些实例中,大家询问了什么设置 cookies。大家应用 Set-Cookie HTTP
头来安装 cookies。

在此地,有一部分设置 cookies 的属性是可选的,比方 Expires、Domain 和
帕特h。值得注意的是,cookies 是在发送行
“Content-type:text/html\r\n\r\n 在此以前棉被服装置的。

编写翻译上面包车型大巴次第,生成 setcookies.cgi,并尝试利用下边包车型大巴链接设置
cookies。它会在你的微机上设置多少个 cookies:

/cgi-bin/setcookies.cgi

获取 Cookies

寻觅全数安装的 cookies 是特别轻便的。cookies 被积攒在 CGI 景况变量
HTTP_老总KIE 中,且它们的款式如下:

key1=value1;key2=value2;key3=value3....

下边包车型客车实例演示了哪些获得 cookies。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc cgi;
   const_cookie_iterator cci;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

   // 获取环境变量
   const CgiEnvironment& env = cgi.getEnvironment();

   for( cci = env.getCookieList().begin();
        cci != env.getCookieList().end(); 
        ++cci )
   {
      cout << "<tr><td>" << cci->getName() << "</td><td>";
      cout << cci->getValue();                                 
      cout << "</td></tr>\n";
   }
   cout << "</table><\n";

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

到现在,编写翻译下边包车型客车顺序,生成
getcookies.cgi,并尝试使用上面的链接获取你的Computer上存有可用的
cookies:
/cgi-bin/getcookies.cgi

UserID XYZ 
Password XYZ123 
Domain www.w3cschool.cc 
Path /perl 

带有参数的台本

为了传递一个参数给脚本,能够在U奥迪Q7L中央银行使 (?) 插入脚本名词和参数之间,
用加号(+) 表示各个单一的参数, 如:

<A HREF="/cgi-bin/myscript?arg1+arg2+arg3">run my script</A>

当服务器收到到那一个恳求,它传递 arg1, arg2, 和 arg3 参数给脚本.
你接下来能在剧本中央银行使这个参数.

本条格局临时叫查询, 因为前期它用在搜求功效中.

  DIE(“unable to dup2 the error log”);

获取 Cookies

寻找全体安装的 cookies 是非常轻巧的。cookies 被积累在 CGI 意况变量
HTTP_首席施行官KIE 中,且它们的款型如下:

key1=value1;key2=value2;key3=value3....

上面包车型客车实例演示了怎么获得 cookies。

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc cgi;
   const_cookie_iterator cci;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的 Cookies</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";
   cout << "<table border = \"0\" cellspacing = \"2\">";

   // 获取环境变量
   const CgiEnvironment& env = cgi.getEnvironment();

   for( cci = env.getCookieList().begin();
        cci != env.getCookieList().end(); 
        ++cci )
   {
      cout << "<tr><td>" << cci->getName() << "</td><td>";
      cout << cci->getValue();                                 
      cout << "</td></tr>\n";
   }
   cout << "</table><\n";

   cout << "<br/>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

现行反革命,编写翻译上边的先后,生成
getcookies.cgi,并尝试利用上面包车型大巴链接获取你的微型Computer上具有可用的 cookies:

/cgi-bin/getcookies.cgi

那会爆发一个列表,展现了上一节中装置的八个 cookies
以及你的微型Computer上存有别的的 cookies:

UserID XYZ 
Password XYZ123 
Domain www.w3cschool.cc 
Path /perl 

文本上传实例

为了上传八个文本,HTML 表单必须把 enctype 属性设置为
multipart/form-data。带有文件类型的 input 标签会成立三个 “Browse” 按键。

<html>
<body>
   <form enctype="multipart/form-data" 
            action="/cgi-bin/cpp_uploadfile.cgi" 
            method="post">
   <p>文件:<input type="file" name="userfile" /></p>
   <p><input type="submit" value="上传" /></p>
   </form>
</body>
</html>

<!--文件:选择文件
上传-->

专注:上边的实例已经故意禁止使用了保留上传的公文在大家的服务器上。您能够在和煦的服务器上尝试上边包车型客车代码。

上面是用于拍卖公事上传的剧本 cpp_uploadfile.cpp:

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc cgi;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的文件上传</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   // 获取要被上传的文件列表
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
      // 在 cout 中发送数据类型
      cout << HTTPContentHeader(file->getDataType());
      // 在 cout 中写入内容
      file->writeToStream(cout);
   }
   cout << "<文件上传成功>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

地点的实例是在 cout
流中写入内容,但你能够展开文件流,并把上传的文书内容保留在指标地方的某部文件中。

练习2: 检查是还是不是有人登入.

既然您了然哪些使用参数,让我们继续上面的例证pinglaura,通过改换那一个例子大家获得上面那么些剧本pinggeneric.

大家取个区别难点:

#!/bin/sh


echo "Content-type: text/html"


echo


echo "<HTML><HEAD>"


echo "<TITLE>Are You There?</TITLE>"


echo "</HEAD><BODY>"

在上边包车型大巴事例中,
下一步应该是测验自个儿是不是登入,在那边我们用参数${1}替代作者的名字lemay, 
${1}作为第贰个参数, ${2}作为首个, ${3}作为第多少个.

ison='who | grep "${1}"'


余下的持有修改如下:

if [ ! -z "$ison" ]; then


        echo "<P>$1 is logged in"


else


        echo "<P>$1 isn't logged in"


fi

echo "</BODY></HTML>"

好了,让大家修改HTML页中的连接吧!原本是那般:

<A HREF="http://www.lne.com/cgi-bin/pinglaura">Is Laura Logged in?</A>

修改为通用查询功用后是如此,譬如查询名字叫john的人是或不是登入:

<A HREF="http://www.lne.com/cgi-bin/pinggeneric?john">Is John Logged in?</A>

在您的服务器上尝试,看是否有结果。

  }

文件上传实例

为了上传贰个文本,HTML 表单必须把 enctype 属性设置为
multipart/form-data。带有文件类型的 input 标签会创设二个 “Browse” 开关。

<html>
<body>
   <form enctype="multipart/form-data" 
            action="/cgi-bin/cpp_uploadfile.cgi" 
            method="post">
   <p>文件:<input type="file" name="userfile" /></p>
   <p><input type="submit" value="上传" /></p>
   </form>
</body>
</html>

这段代码的结果是下面的表单:
文本:选择文件
上传

注意:上边的实例已经故意禁止使用了保留上传的文本在大家的服务器上。您能够在和睦的服务器上尝试上面的代码。

上边是用以拍卖文件上传的脚本 cpp_uploadfile.cpp:

#include <iostream>
#include <vector>  
#include <string>  
#include <stdio.h>  
#include <stdlib.h> 

#include <cgicc/CgiDefs.h> 
#include <cgicc/Cgicc.h> 
#include <cgicc/HTTPHTMLHeader.h> 
#include <cgicc/HTMLClasses.h>

using namespace std;
using namespace cgicc;

int main ()
{
   Cgicc cgi;

   cout << "Content-type:text/html\r\n\r\n";
   cout << "<html>\n";
   cout << "<head>\n";
   cout << "<title>CGI 中的文件上传</title>\n";
   cout << "</head>\n";
   cout << "<body>\n";

   // 获取要被上传的文件列表
   const_file_iterator file = cgi.getFile("userfile");
   if(file != cgi.getFiles().end()) {
      // 在 cout 中发送数据类型
      cout << HTTPContentHeader(file->getDataType());
      // 在 cout 中写入内容
      file->writeToStream(cout);
   }
   cout << "<文件上传成功>\n";
   cout << "</body>\n";
   cout << "</html>\n";

   return 0;
}

上边的实例是在 cout
流中写入内容,但您能够展开文件流,并把上传的文件内容保留在对象地方的某部文件中。

代码链接:https://github.com/karst87/cpp/tree/master/learning/com.runoob

传送其他音信给脚本

有第三种艺术传递消息给CGI脚本. 它叫作路线音信path information
用作那个在本子调用是不用更改的参数,
象贰个一时文件名或调用脚本本人的文书名.
正如你看来的,在上头的例子问号前面包车型地铁参数是因用户表单的输入而改变的.
路线音信Path info用作别的新闻传递给脚本,实际上,你能够用它作其它事情.


门路音信Path information是一种不象经常参数脚本那样往往传递新闻的方法.
路径Path
information经常是指Web服务器上的那几个比方配置文件、不时文件恐怕被剧本因难题调用的文书等等此类文件.

 


看上边一个路径音信path information例子, :

http://myhost/cgi-bin/myscript/remaining_path_info?arg1+arg2

当脚本运营时,在路子中的新闻将被停放于情状参数PATH_INFO.
你能在您的本子内容中选拔那几个新闻.

比方, 让大家借令你在多页上已有七个再而三到同叁个脚本.
你能用那些路子音信展现这么些有连接的HTML文件名. 那样,
在您完结处理你的剧本之后, 当你发回三个HTML文件时,
你能在这一个文件里带有一个总是,发回用户一齐初特别页。

你会在下一章节学到更加多路线新闻:有用的表单和脚本. 待后来见报

  为:

成立叁个特有的脚本输出

未来您早已学习了诸如输出数据 一般地HTML数据 发给浏览器解释显示的数据.
可是一旦您不想把脚本结果作为二个数额流方式发回浏览器,而是想把三个留存的页发回,如何是好?
如若您只是要脚本做一些事而不让任何结果答复给浏览器,怎么做?

不用怕, 这里开首解释这么些情况.

  /*if (dup2(error_log, STDERR_FILENO) == -1) {

用调用另多个文件作为响应

CGI输出不是非得一个数据流,不经常能够告诉浏览器是存在服务器上的一个页,为了发出那几个音信,看上边包车型地铁事例:

Location: ../docs/final.html

那一个Location行用作日常的出口地点,也正是说,借使您用了Location,
你就无须再用象Content-type那样的数量输出(实际上,你也不能够).
正如Content-type, 你也非得在这一行前边跟二个空行.

指向那些文件的路径能够是一个UPRADOL或相对路线.
全部相对路线是指相对于脚本所在的地方.
例子中的final.html文本是在现阶段上贰个索引下docs的目录下:

echo Location: ../docs/final.html


echo

您不可能Content-type 和 Location多少个出口同有的时候候选取. 举个例子,
倘让你想出口二个标准页,可是想在那么些页尾加上客户的源委,
你就得用Content-type自行组装那五个部分.
注意:你能够用脚本命令张开多个当麻芋果件作为数据直接将之输出.


  DIE(“unable to dup2 the error log”);

No Response

偶然对于一个CGI脚本可能一点尚未输出. 不常你只是要从用户那儿搜集点音讯.
你就毫无再调用三个新文本, 也不用输出结果或展开二个留存的文件.
在浏览器上的显示器仍旧不行样子.

很幸运, 这一体很轻松. 你只要输出上边这几个命令就能够(前边跟贰个空行):

echo Status: 204 No Response


echo

本条Status底部提供情状码给服务器(并且也给浏览器).
特别的204将传递给浏览器,倘使能辨识它,它将怎么着也不做.

 


纵然无响应是多少个官方HTTP规定的一片段,但也并非适合全数的浏览器,只怕会爆发意料之外的结果,那你要多试验试试看啦.


  }*/

管理表单的本子

今日,大好多CGI脚本是用来管理表单输入的.
这么些进程差十分少象下边说演讲的同样,但要么稍微差别,举例CGI脚本只要被调用;数据如何从服务器被发向浏览器.

记住, 大多数表单有八个部分: HTML的表单格式;处理表单数据的CGI脚本.
那几个CGI脚本使用标签<FORM>属性调用的.

  不然会现出谬误:

表单情势和表单脚本

正如上边所说,由于表单有四个部分. 如下:

以此ACTION属性满含着拍卖表单的脚本:

<FORM ACTION="http://www.popchina.com/cgi-bin/processorscript">

在那么些表单中, 每一个输入区都有四个NAME的脾气, 用来称呼表单成分.
当那几个表单数据被递交给你在ACTION中定义的CGI脚本,
那样这一个name和输入内容被用作四个数字或字符传递给脚本.

log.c:73 unable to dup2 the error log:bad file deor

GET 和 POST

表单从浏览器发给服务器有三种方法.  GET 和 POST.

大家地方议论的不二秘技,实际是GET,它将数据打包放置在条件变量QUE奥德赛Y_ST汉兰达ING中作为UENVISIONL全体的一有个别传递给服务器。

POST做过多好像GET同样的事情, 不相同的地点就是它是分手地传递数据给脚本.
你的剧本通过标准输入获取那一个数据. (有个别Web服务器是积攒在不经常文件中.)
那个QUEENCOREY_STHavalING意况变量将不再设置.

那您用特别方式呢? POST是个平安的章程, 尤其即使您的表单中有很相当多据的话.
当你用GET, 那一个服务器就分配变量QUEEnclaveY_ST途乐ING给全数的表单数据,
可是以此变量可存款和储蓄量是有限的.
换句话说,假诺你有好许多量只是你又用GET,你会屏弃很相当多据.

比如您用POST, 你能够尽大概多地动用数据,
因为那一个数量平昔也不分配到二个变量里.

终极优化调用交叉编写翻译器的strip命令将调节和测量试验消息剥去,获得的尾声程序独有约60KB大小。

URL 编码

U奥迪Q5L 编码是一种浏览器用来打包表单输入的格式.
浏览器从表单中收获具备的name和内部的值,将她们作为name/value参数编码,
移去那个无法传递的字符,
将数据排行等等,那么些还取决于你用GET依旧POST?作为U悍马H2L的一某些可能分离地发给服务器.
不管哪一类境况, 在劳务器端的表单输入格式样子象这样:

theName=Ichabod+Crane&gender=male&status=missing&headless=yes

UEvoqueL编码遵从下列法规:

  • 每对name/value由&符分开.
  • 每对来源表单的name/value由=符分开.
    若是用户并未输入值给这一个name,那么那一个name依然现身,只是无值(象那样
    “name=”).
  • 其余异样的字符(正是这个不是简约的八个人ASCII,如汉字)
    将以百分符%用十六进制编码. 当然也席卷象 =, &, 和 % 这一个特种的字符.
  • 在输入区中的空格将以加号+展现.

因为表单输入是用这几个UOdysseyL编码传递给您的本子的,在您用那些参数之前必须解码,因为解码是个很宽泛的做事,能够有成都百货上千工具做那些工作. 你从未须要本人写那几个解码程序.

此地介绍一个叫uncgi的解码程序,
你能够从.
获得原码,安装在您本身的cgi-bin目录下.

# make

勤学苦练3: 告诉作者你的名字.

让我们以那么些事例来验证,如图5.

图5.
告诉本身你的名字的表单.

本条输入被发放脚本, 然后发回显得一个hello的音讯(间图.6).

若是您在人名输入处不输入任王辉东,会怎么样?见图7.

图6.
姓名表单的结果.

图7. 另四个结果.

# arm-linux-strip boa

修改表单的HTML

近些日子大家举三个实在的例证:

<FORM METHOD=POST ACTION="../cgi-bin/form-name">


</FORM>

借使您在用uncgi从input中解码, 情状有一点点区别. 为了是uncgi平常办事,
你首先必须调用uncgi , 借使uncgi是个目录,加上实际的脚本名, 象那样:

<FORM METHOD=POST ACTION="../cgi-bin/uncgi/form-name">


</FORM>

如此那般,你不要修改表单中原来的HTML; 原始的HTML能够干活得很好.

(二)           配置boa

脚本

管理表单输入的是个CGI脚本, 让大家来稳重地看看。

在本子中率先步是解码,在这一个事例中, 大家已经运用uncgi解码输入数据,
实际这几个表单已经为您办好解码.
通过树立三个uncgi的目录,一旦表单递交给服务器,服务器会自行实行解码,那样,全数的name/value已经计划妥善等待你的使用.

前几日,贰个例子初阶某些借使是上面那样:

echo Content-type: text/html


echo


echo "<HTML><HEAD>"


echo "<TITLE>Hello</TITLE>"


echo "</HEAD><BODY>"


echo "<P>"

接下去,有三种景况要拍卖:一件是拍卖用户不输入名字的图景,一个是就算输入了向他们说hello.

那个Name元素的值, 是带有在WWW_theName境况变量中.
用一个简练的测量检验命令(-z),
你能查看意况变量是不是是空的照旧总结相应的输出值:

if [ ! -z "$WWW_theName" ]; then


    echo "Hello, "


    echo $WWW_theName


else


    echo "You don't have a name?"


fi

最后扩充贰个连连”go back” . 用来回到:

echo "</P><P><A HREF="../lemay/name1.html">Go Back</A></P>"


echo "</BODY></HTML>"

设置完Boa软件后,需求对Boa举行布局,其配备文件是boa.conf,那一个文件在源代码中有,将其拷贝到嵌入式Linux根文件系统的/etc/boa目录下。然后对那些文件多少个主要的地点举行如下修改[2]。

问题

此间是使用CGI脚本比较普及的难题:

  • 剧本内容只显示不施行.

    你不利配置了你的服务器运行CGI脚本?
    你的脚本是放置在cgi-bin目录中呢?假诺你的服务器允许带.cgi扩大名的CGI运转,
    你的台本文件名的扩充名是这么吧?

  • Error 500: Server doesn’t support POST.

    解答依旧如上一条同样,然后你用命令行推行你的CGI,能够健康运作吧?是或不是有荒唐?.

  • Document contains no data.

    规定你的底部行和数据部之间有一空行.

  • Error 500: Bad Script Request.

    规定你的脚本是可实践的(在UNIX, 用chmod +x 你的脚本.cgi).
    在从浏览器运维此前,你应该从命令行运转你的台本,借使客户端是win95,可以用telnet登录你的服务器,实施命令行,当然不可不了然UNIX命令.

#[3]监听的端口号,缺省都以80,不做修改

CGI变量

表2 总计那一个境遇变量.

 

环境变量         
意义
SERVER_NAME CGI脚本运行时的主机名和IP地址.
SERVER_SOFTWARE 你的服务器的类型如: CERN/3.0 或 NCSA/1.3.
GATEWAY_INTERFACE 运行的CGI版本. 对于UNIX服务器, 这是CGI/1.1.
SERVER_PROTOCOL 服务器运行的HTTP协议. 这里当是HTTP/1.0.
SERVER_PORT 服务器运行的TCP口,通常Web服务器是80.
REQUEST_METHOD POST 或 GET, 取决于你的表单是怎样递交的.
HTTP_ACCEPT  浏览器能直接接收的Content-types, 可以有HTTP Accept header定义.
HTTP_USER_AGENT 递交表单的浏览器的名称、版本 和其他平台性的附加信息。
HTTP_REFERER 递交表单的文本的 URL,不是所有的浏览器都发出这个信息,不要依赖它
PATH_INFO 附加的路径信息, 由浏览器通过GET方法发出.
PATH_TRANSLATED 在PATH_INFO中系统规定的路径信息.
SCRIPT_NAME 指向这个CGI脚本的路径, 是在URL中显示的(如, /cgi-bin/thescript).
QUERY_STRING 脚本参数或者表单输入项(如果是用GET递交). QUERY_STRING 包含URL中问号后面的参数.
REMOTE_HOST 递交脚本的主机名,这个值不能被设置.
REMOTE_ADDR 递交脚本的主机IP地址.
REMOTE_USER 递交脚本的用户名. 如果服务器的authentication被激活,这个值可以设置。
REMOTE_IDENT 如果Web服务器是在ident (一种确认用户连接你的协议)运行, 递交表单的系统也在运行ident, 这个变量就含有ident返回值.
CONTENT_TYPE 如果表单是用POST递交, 这个值将是 application/x-www-form-urlencoded. 在上载文件的表单中, content-type 是个 multipart/form-data.
CONTENT_LENGTH 对于用POST递交的表单, 标准输入口的字节数.

Port 80

表单输入的解码程序

近日有八个程序: 通用指标的uncgi, 和cgi-lib.pl,
那是个Perl库,用于perl编写的CGI脚本.

自然也会有表单上载时能够解码的程序,非常少。

#
调用的IP地址,注释掉,那样注解绑定到INADDKuga_ANY,通配于服务器的有所IP地址。不设定静态固定的服务器地址。

uncgi

表达原码能够从 获得。

#Listen 192.68.0.5

cgi-lib.pl

那是由Steve Brenner编写的, 支持您管理输入.
他能从GET和POST获取输入况且放置在叁个Perl列表或阵列中.
更新的本子也能管理来自表单的文本上传. 从此刻能够收获新闻与原码
.
假若你调控用Perl语言管理你的表单输入,cgi-lib是个很好的库.

为了利用cgi-lib.pl,你平凡要如此写:
#!/usr/lib/perl

require 'cgi-lib.pl';

cgi-lib中纵然有相当多子程序, 最要害的是ReadParse子程. ReadParse
读取输入便利地将name/value储存在多少个Perl阵列中.
在您的Perl脚本中国和东瀛常是那样调用的:

&ReadParse(*in);

此例中,阵列名是in, 能够不管取名的.

在表单输入解码后, 你能读取和管理那一个name/value,方法是象上边那样:

print $in{'theName'};

以此将显示名字name是theName的值value.

举例您有八个用同样名字的name对, cgi-lib.pl用(\0)分隔八个名字.
那样能够健康管理你的脚本.

#设定十三分Linux用户组的哪位用户,对Boa具备权力

解码上传的文本输入

依靠表单的文书上传必要区别的表单输入,有一部分先后能够对其开始展览解码。

cgi-lib.pl 后来版本能够很好帮助, 在
了然越来越多的处境.

另二个拍卖用Perl编写的CGI地址是
.

User root

自己做

找特地书籍学习啊: .

Group root

非解剖的脚本底部

依据本书演讲,大大多情景能够健康操作,在有的场所下不是如此的,你能够翻阅表达书掌握。

#指鹿为马日志文件。设计路径在/dev/console下。

<ISINDEX> 脚本

为了在CGI中形成探究组, 大家看看叫<ISINDEX>的寻觅.
那是最初在浏览器中用来向服务器发出搜索关键字的主意,参看从前的材料。

ErrorLog /dev/console

总结

CGI脚本, 一时叫服务器端脚本或网关脚本。
在internet上有很多无需付费能源,你能够寻觅下载读懂他们,当然都以斯洛伐克语的,假诺你下决心翻译他们(恐怕更强明白).
那样一矢双穿啊.

专注:上述顺序能够用ultra edit来编排,注意调换UNIX格式
,必须接纳UNIX格式存盘,再上载,用telnet登入,在指令行键入perl
sample.pl,看有无bug,再
在浏览器中调用。CGI程序包蕴放置CGI的目录须求求改属性为777,
要写入的HTML文件也要改属性为777.

当今英特网有广大免费的cgi,基本得以满意一般需求,请到那几个网站查询你要的cgi:

小编汉化了八个古老的通用留言簿,大家能够拿去做和好的留言簿。此处下载

#访问日志文件。设置为/dev/null意味关闭AccessLog功效,运营服务器时不载入日志文件。

AccessLog /dev/null

#服务器名字

ServerName friendly-arm

# HTML文书档案的主目录,访问的页面即放在这一个目录下。

DocumentRoot /www

#HTML目录暗中同意索引文件名。

DirectoryIndex index.html

#二个接连所允许的HTTP持续成效乞求最大数目。

KeepAliveMax 1000

#HTTP持续成效中服务器在四回呼吁之间等待的年月数,以秒为单位。

KeepAliveTimeout 10

#指明mime.types[4]文本地方。

MimeTypes /etc/mime.types

#文本扩张名尚未或不详的话,使用的缺省 MIME 类型。

DefaultType text/plain

#提供 CGI 程序的 PATH 情状变量值。

CGIPath /bin:/usr/bin:/usr/sbin:/sbin

#指明 CGI 脚本的杜撰路径对应的莫过于路线, /www/cgi-bin/
是本人的根文件系统的目录。

ScriptAlias /cgi-bin/ /www/cgi-bin/

拷贝主机 /etc/mime.types 文件到根文件系统的 etc 目录下。

(三)           测验与失误管理

1 、静态网页测验

将一静态网页放置到HTML文书档案的主目录/www下,为了便利文件名修改为index.html,并在浏览器中输入指标板ip如

2、cgi测试

首先,编写Helloworld.c程序

int main(void)

{

      printf(“Content-type:text/html\n\n”); //那句应当要加多

      printf(” Hello,world.”);

      exit(0);

}

穿插编写翻译arm-linux-gcc -o helloworld.cgi  helloworld.c

将helloworld.cgi复制到/www/cgi-bin/目录下,注意实践权限,并在浏览器中输入
helloworld.cgi就能够看到相应的网页。

(四)           cgi编程

动态网页的规划有好些个措施,CGI是内部之一。Boa服务器辅助cgi,这里介绍二种方法使用cgi达成客户端与服务器的通讯。

率先理解cgi基本原,CGI全称是“公共网关接口”(Common Gateway
Interface),HTTP服务器本地或远程应用程序通讯的一种接口,其先后须运维在互联网服务器上。在大要上,CGI是一段程序,它运营在Server上,提供同客户端
Html页面包车型客车接口。那样说大概还不佳了然。那么我们看贰个事实上例子:
今后的个人主页上绝大大多都有贰个留言本。留言本的专门的学问是那样的:先由用户在客户端输入一些音讯,如名字之类的东西。接着用户按一下“留言”(到最近甘休职业都在客户端),浏览器把这个新闻传送到服务器的CGI目录下一定的cgi程序中,于是cgi程序在服务器上坚守预订的章程开始展览处理。在本例中正是把用户提交的新闻存入钦赐的公文中。然后cgi程序给客户端发送叁个消息,表示央求的职务已经竣事。此时用户在浏览器里将看到“留言甘休”的字样。整个进度结束。

n            CGI职业的第一级程是:

1.贰个用户央浼激活三个CGI应用程序;

2.CGI应用程序将并行主页里用户输入音讯提抽出来;

3.将用户输入的音信传给服务器主机应用程序(如数据库查询〕;

4.将服务器管理结果通过HTML文件重临给用户;

5.CGI进度截至。

n            HTML语言与HTML表单

HTML(超文本标识语言)是用来创建与平台非亲非故的超文本文书档案的简约标志语言,踟[MI,能够用来标识超文本新闻、邮件、文书档案、超媒体、菜单选项、数据库查询结果以及有内嵌图形的轻便结构文书档案。HTML为文书档案编码,满含要显得的文书、文本怎样格式化的音讯、要来得的图片名字(不是图表自己)、以及任何注重音讯。连接到叁个网页时,Web浏览器(如IE)就在内存中遵循HTML的构造“构造”该网页,然后在显示器上体现组装好的网页。

日常浏览器只好通过HTML乞求从服务器获取静态网页进行浏览,假若用户要求通过浏览器提交一些数量给服务器实行管理并赶回结果以完成交互的作用则要用到HTML表单。HTML表单是用户通过浏览器提交数据为十分重要输入手腕,它由一般性文字、标识和部分名称为“控件”的非常成分(如复选框、单选开关、菜单等)以及控件上的竹签组成。用户通过填写或接纳控件内容来输入数据,最终交给给服务器进行管理。

上边是八个表单的演示:

FORM的一部分参数解释如下:

1.      action钦点了调用的CGI脚本

2.      methed定义了表单被提交的秘技。methed有三种,GET和POST。GET是CGI默许的传导方法,用户输入的数量会附在U大切诺基L之后传给Web服务器。POST方法传递数据时,服务器端CGI管理程序会从SID躺中接收传输入数据。

3.      reset的外观和submit相似,可是假诺用户按下它,那几个form中的全部输入值都会被解除,只怕是回到起初值。

n            CGI的办事体制

上一节讲到浏览器提交数据要求接纳HTML表单。那么服务器端是什么对这几个数量开始展览甄别和管理呢,那就供给用到CGI,通过CGI能够宪成浏览器与WEB服务器之间的新闻交互。

CGI(common gateway interface)WEB
服务器和平运动作在劳务器端的外部程序之间的一个接口标准,依据那么些正式编写并运转的外表程序就叫做CGI程序,其目的是促成Web服务器与客户端浏览器之间的动态交互。CGI程序通过由Web服务器来调用完毕和WEB浏览器之间的竞相,如下图所示,Web服务器将WEB浏览器发送来的新闻,传送给CGI程序,由CGI程序开始展览管理,CGI程序在拍卖完后将响应结果再回送给Web服务器,然后由Web服务器发送到Web浏览器。假诺急需调用别的外界应用如数据库服务等,均由CGl程序去与外表应用实行交互.

浏览器与Web服务器的有血有肉交互进度如下:

(1)客户机使用TCP/IP协议,与服务器创设连接,发送U宝马X3L诉求;

(2)Web服务器到对应的目录中调用CGI程序,使用客户机传递的参数作为CGI程序的参数,而CGI程序调用相应的表面程序达成操作;

(3)CGI程序以能被辨认的格式重返管理结果给HTTP服务器;

(4)Web服务器将数据再次来到客户机管理,展现CGI实施结果。

CGI程序与Web服务器进行通讯、传递有关参数和管理结果是透过命令行参数、规范输出、情形变量来贯彻的。如下图所示,CGI的业内输入(STDIN)是服务器的业内输出(STDOUT),而CGI的正规输出则是服务器的正式输入。客户的央浼音讯经过服务器的正经输出传送绘CGI的正经输入,CGI对消息进行拍卖后,将结果发送到它的规范输出,也便是服务器的标准输入,然后由服务器将管理结果发送给客户端。这里以boa为例,整个通讯流程图如下所示:

还要,CGI程序能够由此情形变量获取Web服务器传递过来的用户数量,常见的景况变量有:

1.      SESportageVECRUISER-NAME:运营CGI序为机械名或IP地址。

2.      SEOdysseyVEPAJERO-INTELANDFACE:WWW服务器的项目,如:CEEscortN型或NCSA型。

3.      SE奥迪Q7VE路虎极光-PROTOCOL:通讯协议,应当是HTTP/1.0。

4.      SEOdysseyVE凯雷德-PORT:TCP端口,一般说来web端口是80。

5.      HTTP-ACCEPT:HTTP定义的浏览器还不错的数据类型。

6.      HTTP-REFEREGL450:
发送表单的公文UGL450L。(并不是全体的浏览器都传送这一变量)

7.      HTTP-USE奥迪Q7-AGENT:发送表单的浏览器的有关新闻。

8.      GETWAY-INTESportageFACE:CGI程序的版本,在UNIX下为 CGI/1.1。

9.      PATH-TRANSLATED: PATH-INFO中包蕴的实际路线名。

10.  PATH-INFO:浏览器用GET方式发送数据时的增大路线。

11.  SC昂CoraIPT-NAME: CGI程序的路径名。

12.  QUEENVISIONY-ST陆风X8ING:表单输入的数目,U福睿斯L中间号后的始末。

13.  REMOTE-HOST:发送程序的主机名,无法明确该值。

14.  REMOTE-ADDCRUISER:发送程序的机械的IP地址。

15.  REMOTE-USE奥德赛:发送程序的人名。

1)      利用shell脚本获取QUE君越Y_ST奥迪Q5ING景况变量

一般这种办法适用于选取get方法提交的表单,post方法提交的表单要经过标准输出获取。可是对于boa服务器二种艺术效果是平等的,纵然选拔post形式url中还能够赢得相应的新闻。规范的shell程序如下(友善的led测量试验脚本,位于/www/leds.cgi):

#!/bin/sh

type=0

period=1

case $QUERY_STRING in

       *ping*)

              type=0

              ;;

       *counter*)

              type=1

              ;;

       *stop*)

              type=2

              ;;

esac

case $QUERY_STRING in

       *slow*)

              period=0.25

              ;;

       *normal*)

              period=0.125

              ;;

       *fast*)

              period=0.0625

              ;;

esac

/bin/echo $type $period > /tmp/led-control

echo “Content-type: text/html; charset=gb2312”

echo

/bin/cat led-result.template

exit 0

网页上校要交给的表单action设置为leds.cgi就可以。即

<td colspan=”2″ align=”center”><form method=”post”
action=”leds.cgi” name=”LED-TEST”>

       这种艺术通讯的款式如下所示:

2)      利用cgic库编制程序动态网页

    CGI的输出包蕴四个尾部消息和二个数据体,两个之间用三个空行隔离。当中必须带有一个头顶音信,借使含有数据体,则供给有Content-type,即MIME类型。MIME为Multipurpose
Internet Mial Extension
protocol的缩写,即多用途网际邮件扩大协议,它设计的最初目标是为了在出殡和埋葬电子邮件时附增加媒体数据,让邮件客户程序能依赖其种类实行管理。当它被HTTP协议协助之后,它的意思就更为主要了。它使得HTTP不仅可以传输普通的公文,何况能传输声音、录像等数码。MIME类型由两局地构成,前面是数据的大类型,前边定义具体的等级次序。常见的MIME类型如下表所示:

CGI程序一般由以下三部分构成:

(1)数据解码部分:通过表单输入、由浏览器传送给服务器的数量都以经过U路虎极光L编码的,必须开始展览解码。假若不须要管理表单输入,则该片段省略。

(2)数据底部分:必须饱含这一有的作为第二个输骑行,该行后必须有一空格行。该行能够是下列二种之一:

ü        数据类型,如:Content-type:text/html

ü        地址类型(Location),如:location://www.kernel.org

ü        状态类型(Status),如:status:200 OK

(3)CGI程序主体部分。

对经过表单输入的数目开始展览管理,并出口到专门的学业输出。

汇总,CGI程序的功力是赢得Web服务器传送的数量,解码管理后,依据用户的渴求开始展览任何的操作。一般是调换动态Web页面只怕调用别的的应用服务。

从规律上说,CGI程序设计能够选拔任何读写规范输入,输出的语言,比方C/C++、Perl、Java等。但在嵌入式系统中,C语言是贰个首荐的工具语言。

这里运用规划好的一个cgic库来进展cgi的相干操作

CGIC是二个帮助CGI开荒的开放源码的正经C库。移植比较简单。

1、下载源码

    

    tar xzf cgic205.tar.gz(实际下载到的是.tar.tar,同样)

2、修改Makefile文件

修改 CC = gcc为 CC = /usr/local/arm/2.95.3/bin/arm-linux-gcc

修改 AR = ar为 AR = /usr/local/arm/2.95.3/bin/arm-linux-ar

修改 RANLIB = arnlib为 RANLIB =
/usr/local/arm/2.95.3/bin/arm-linux-ranlib

修改 gcc cgictest.o -o cgictest.cgi ${LIBS}为 $(CC) $(CFLAGS) cgictest.o
-o cgictest.cgi ${LIBS}

修改 gcc capture.o -o capture ${LIBS}为 $(CC) $(CFLAGS) capture.o -o
capture ${LIBS}

3、编译

    make编译,得到CGIC库libcgic.a

4、验证

将capture和cgictest.cgi复制到主机的/var/www/cgi-bin目录下,IE输入

    注意:拷贝至目的板上后,必须退换其本性chmod 755 *

      
cgictest.cgi是cigic的二个例程,入口在cgimain,参考cgictest.c能够编写出其他的动态网页。须要小心的是fprintf(“Content-type:text/html\n\n”);
//那句一定要增加。

金沙注册送58 3

相关文章

网站地图xml地图