第一个CGI程序

————完全就是普通的C语言嘛

 ‘(*∩_∩*)′
PainterQ

2017年5月14日

上一篇博文里面叙述了Apache的安装和配置方法,恍恍惚惚我就拥有了自己的第一个http服务器。虽然是局域网下的网站但给同学们开开车还是完全够了(咳咳)。好像是有了Apache再把HTTP文档丢到htdocs文件夹就可以了,老司机的工作竟然如此轻松。其实还有很多的姿势都还没有掌握哦,不追求新姿势的人生和咸鱼有什么分别!就是老司机也要做姿势最多的那一个。这一篇我们一起来了解一下什么是动态网页,什么是CGI。

1.动态网页?那么CGI是什么呢

  当网站越来越大,人们终于一如以往的怠惰起来。那一天,大家终于厌烦了一遍遍的制作相似的HTML文档,抱怨着两个文档只有少许的不同就要重写一分,他们开始感到被HTML支配的恐惧,空气的丝缕间溢出的都是绝望的气息。一个俊俏的少年看着无力的人们,说“为什么不写个程序或者脚本来产生HTML呢?”。只一句,浓雾炸裂,日月恢复了昔日的光华。

  能够根据用户的请求动态生成的网页就是动态网页(而不是利用Javascript实现动态交互的网页)。现在已经到处都是这种方法的影子,哪些以.asp、.jsp、.php、.cgi等结尾的页面便是动态生成的(不也这些结尾不代表就不是)。当用户向服务器请求时,服务器根据请求的参数调用运行在服务器上的外部程序来生成页面内容(可以想象这个程序就是一般的程序或脚本,他也许仅仅是处理请求的内容,他也许要访问数据库,他可以做他想做的一切)。CGI是一种接口,他说明了外部程序如何被服务器调用。具体的就是,参数如何传入,处理后的信息如何返回。一般说"CGI程序"是指用C/C++写成的*.cgi程序(就是把编译后的*.exe直接改后缀为*.cgi。实际上我才不管你是什么语言,只要编译成.exe就行)。但是严格地讲CGI不是指哪一种语言写成的程序或脚本,而是凡是能满足CGI接口的语言写成的程序或脚本都叫CGI程序,可以是PHP,python等。

2.环境变量 和 标准输入输出

  一次web请求在HTTP层面就是三部分:请求行、消息报头、请求正文(下一篇博文讨论HTTP协议,欢迎赏光)。请求行和消息报头的一些信息通过环境变量传递给CGI程序,请求正文则以标准输入的方式传给CGI程序,最后,输出消息以标准输出的方式传出并使用HTTP协议发送给客户(当然可以没有输出)。标准输入输出大家一定不陌生,就是printf(),cin,cout。环境变量是操作系统层面的"全局变量",任何程序都可以注册新的环境变量或访问已有的环境变量,正因如此环境变量成为进程之间交互的一种方式。

  在stdlib.h中声明了库函数getenv()用于根据环境变量的名字(char*)获取环境变量,原型如下

char * getenv(const char *name);

  举个例子吧,装过JAVA的都知道要设置一个名叫Path的环境变量,我们就用这个函数来获取Path的内容,仅作为该函数的演示。

 #include <cstdlib>
#include <iostream>
int main()
{
std::cout << getenv("path")<<std::endl;
return ;
}

图1.运行结果

  如果本程序编译出现问题,请参看:解决This function or variable may be unsafe

3.第一个CGI程序

  CGI需要用到的环境变量有哪些呢,我们来写第一个CGI程序,它的功能就是返回所有的需要用到的环境变量。这些环境变量其实很多都是HTTP协议的报头,欢迎参看:HTTP协议解析。

  首先定义一个结构数组以方便一会输出,如图。

for (int i = ; i < ; i++) {
std::cout << "<li style = \"color:blue\">";
_dupenv_s(&env, &length, nevName[i].name.c_str());
std::cout << nevName[i].name << ':';
if (env == nullptr) {
std::cout << "<br/>";
}else {
std::cout <<"<span style = \"color:green\">" <<env
       std::cout <<"</span>"<< "<br/>";
}
//使用一个循环依次输出各项的内容

          图2.定义结构数组

  编译后把exe文件放到Apache的cgi-bin文件夹中,再写一个HTML来请求这个程序。并把文件放到htdocs文件夹。

<html>
<head><title>第一个CGI</title></head>
<body>
<form action = "/cgi-bin/firstCGI.cgi" method="post">
<input type ="submit">
</form>
</body>
</html>

  执行结果:

    

          图3.点击按钮之前

                    图4.点击提交之后

第一个CGI程序-----完全就是普通的c语言嘛‘(*∩_∩*)′的更多相关文章

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

    Hello World! 这是我的第一个 CGI 程序上面的 C++ 程序是一个简单的程序,把它的输出写在 STDOUT 文件上,即显示在屏幕上.在这里,值得注意一点,第一行输出 Content-ty ...

  2. ubuntu下使用C语言开发一个cgi程序

    主要步骤是: 1. 开发一个C程序(在标准输出中输出HTML字符串) 2. 复制到apache2的cgi-bin目录去 3. 在httpd.conf中开启cgi功能(我似乎没用到,也可以使用cgi) ...

  3. 写一个CGI程序并运行

    准备Linux和Apache我在/var/www/cgi-bin/下建一个文件get.c #include <stdio.h> #include <stdlib.h> int ...

  4. 编写我的第一个CGI代码——python学习

    在编程学习网站学习Python语言,学习到cgi编程章节遇到了一些小问题,课程介绍的为linux环境的Apache配置方法,具体如下: [linux环境配置方法:] 在进行CGI编程前,确保您的Web ...

  5. httpd cgi程序配制+.py .cgi执行

     vi /etc/httpd/conf/httpd.conf httpd默认首页配制: DirectoryIndex index.html index.html.var 首页的位置定义: Docume ...

  6. C语言写CGI程序

    一.CGI概述 CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准.Web服务器通过调用CGI程序实现和Web浏览器的交互, 也就是CGI程序接受Web浏览器发送给 ...

  7. 用 c 写 CGI 程序简要指南

    文章摘要:  CGI规定了Web服务器调用其他可执行程序(CGI程 序)的接口协议标准.Web服务器通过调用CGI程序实现和Web浏览器的交互.CGI程序可以用任何程序设计语言编写,如Shell脚本语 ...

  8. 配置apache运行cgi程序

    配置apache运行cgi程序 文章目录 [隐藏] ScriptAlias目录的CGI ScriptAlias目录以外的CGI 配置apache运行cgi程序可分为两种情况,一是ScriptAlias ...

  9. 一、Java语言概述与开发环境、第一个java程序

    目录: 1.1 Java特点 1.2 Java程序运行机制 1.3 安装JDl和配置环境变量 1.4 第一个JAVA程序 1.5 第一个JAVA程序的含义 前言 Java语言历时近二十年,已发展成为人 ...

随机推荐

  1. JQuery 根据ID在页面中定位

    1.锚点跳转简介 锚点其实就是可以让页面定位到某个位置上的点.在高度较高的页面中经常见到.比如百度的百科页面,wiki中的page内容. 我知道实现锚点的跳转有两种形式,一种是a标签+name属性:还 ...

  2. sdkman安装

    软件开发工具管理包(Software Development Kit Manager,简称SDKMAN) 用来管理多个版本的开发环境的工具.提供命令行来安装.切换.删除.列出候选版本. 官网地址:ht ...

  3. bootstrap的常用组件和栅格式布局

    Bootstrap 是最受欢迎的 HTML.CSS 和 JS 框架,用于开发响应式布局.移动设备优先的 WEB 项目. 因为Bootstrap需要jquery的支持,所以在使用Bootstrap之前要 ...

  4. 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 G - 免费馅饼

    https://vjudge.net/contest/68966#problem/G 正解一: http://www.clanfei.com/2012/04/646.html #include< ...

  5. 案例分享|某医药集团的BI建设案例

    相比于传统型BI,越来越多的企业开始接受并青睐新型的自助式BI,因其项目上线快,失败风险小,简单易用,颇受赞誉.以下是某医药集团上线帆软BI系统FineBI的案例,从用途架构.指标分析.和信息交互几方 ...

  6. node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了

    最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...

  7. C#集合之并发集合

    .NET 4 开始,在System.Collection.Concurrent中提供了几个线程安全的集合类.线程安全的集合可防止多个线程以相互冲突的方式访问集合. 为了对集合进行线程安全的访问,定义了 ...

  8. CSS3特效----制作3D旋转照片展示区

    任务一.制作多背景 提示:上层有一个径向渐变,渐变图像farthest-side ellipse at center,  rgba(246,241,232,.85) 39%,rgba(212,204, ...

  9. 通过BitSet完成对单词使用字母的统计

    什么是BitSet BitSet类实现了一组位或标记(flag),这些位可被分别设置或清除.当需要跟踪一组布尔值时,这种类很有用. 您只需让每一位对应一个值,并根据需要设置或清除即可. 标记(flag ...

  10. linux下MongoDB客户端shell基本操作

    MongoDB 是一款NoSql数据库,没有固定的模式,即同一个集合中的不同文档结构可以不同,如:第一条记录{name:”xiaoming”},第二条记录:{name:”xiaoli”,age:15} ...