---恢复内容开始---

转自http://www.moon-soft.com/program/bbs/readelite887957.htm

用 C/C++ 写 CGI 程序

小传(zhcharles) 

其实用 C/C++ 写 CGI 程序非常简单,主要是要清楚什么是 CGI。

CGI全称 Common Gateway Interface (共同编程接口),是一种编程接口,不论什么语言,只要按照该接口的标准编写出来的程序,即可叫做 CGI 程序。CGI 程序的输入/输出是使用编程语言的标准输入/标准输出,所以用 C/C++ 来写 CGI 程序就好象写普通程序一样,不过还有几样东西要注意的。

1、CGI 程序的通信方式

当有数据从浏览器传到 Web 服务器后,该服务器会根据传送的类型(基本有二类:GET/POST),将这些接收到的数据传入 QUERY_STRING 或 变量中,CGI 程序可以通过标准输入,在程序中接收这些数据。当要向浏览器发送信息时,只要向 Web 服务器发送特定的文件头信息,即可通过标准输出将信息发往 Web 服务器,Web 服务器处理完这些由 CGI 程序发来的信息后就会将这些信息发送给浏览器。这样就是 CGI 程序的通信方式了。

2、接收数据

用 GET 方式接收到的数据保存在 Web 服务器的 QUERY_STRING 变量里,而通过 POST 方式接收到的数据是保存在 这个 Web 服务器变量里。它们的唯一区别就是:以 GET 方式接收的数据是有长度限制,而用 POST 方式接收的数据是没有长度限制的。并且,以 GET 方式发送数据,可以通过 URL 的形式来发送,但 POST方式发送的数据必须要通过 Form 才到发送。

 

好,现在让我们用 C 语言写一个神圣的 CGI 程序 -- Hello,World!

vi hello.c  # 编辑源文件

//  Begin

#include <stdio.h> 
main() { 
    printf("Content-type:text/html\n\n"); 
    printf("Hello,World!"); 
}

//  End

gcc -o hello hello.c  # 编译

将该程序放在 Web 服务器的 cgi-bin 目录下,然后通过以下方式访问:

http://www.server.com/cgi-bin/examples/c/hello

这将在浏览器里打印出 Hello,World!

这就算得上是一个 CGI 程序了,是不是很简单?^_^ 第一句 printf() 是打印头信息,让 Web 浏览器知道以下打印的数据是什么类型的数据,本例子中指定了 text/html 类型,即 html 文档,所以下面的那句 printf() 打印的内容就会像我们写网页内容一样在浏览器上显示出来。

用 C/C++ 写 CGI 的最难之处应算从浏览器接收数据!不过,借助现成的源程序,从浏览器接收数据也只不过是小菜一碟而已。

我说的这个现成的源程序是用 FireBird 的 bbs2www 程序包里提取出来的。在这里下载:cgi.c - cgi.h

经本人提取出来的源程序只有两个文件 cgi.c 和 cgi.h。当要用它们来写 CGI 程序时,只需在程序中加入 #include "cgi.c" 即可,现以例子说明一下使用方法。假设要通过 GET 方式从浏览器接收用户的名字和 E-Mail 地址,源程序如下:

vi test.c # 编辑源文件

// Begin

#include <stdio.h> 
#include "cgi.c"

main() { 
    char *name,*email;

cgi_init(); 
    cgi_html_head(); 
    name = cgi_get("name"); 
    email = cgi_get("email");

printf("name = %s",name); 
    printf("<br>"); 
    printf("email = %s",email);

cgi_quit(); 
}

// End

首先定义两个指针,然后调用 cgi_init() 来初始化 CGI 环境, cgi_html_head() 打印 HTML 文件类型信息,和 printf("Content-type:text/html\n\n"); 基本一样,不过用 cgi_html_head() 打印的头信息会指定文件的字符编码为 gb2312 即中文字符。调用 cgi_get() 方法取得指定关键字( name 和 email )的值。当完成 CGI 部分的代码后,要通用调用 cgi_quit() 和释放 CGI 所点的系统资源。最后就像以住一样去编译程序,gcc -O6 -o test test.c 然后将该程序放到 cgi-bin 目录,接着通过以下方式调用该程序。

http://www.server.com/cgi-bin/examples/c/test?name=charles&email=charles@netease.com

---恢复内容结束---

CGI初识的更多相关文章

  1. 【转】初识CGI

    一.基本原理 CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口.通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器 ...

  2. shell脚本--初识CGI

    CGI按照百度百科的定义,如下: CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能.CGI 应用程序能与浏览器进行交互,还可通过数据库API 与数据库服务器等外部数 ...

  3. 初识CGI

    CGI Web 服务器只能生成静态内容,而用户请求动态内容时,Web服务器只能借助一些应用程序来实现.CGI时一套标准,它规定了Web服务器和应用程序之间的交互方式. 静态内容与动态内容 要想理解什么 ...

  4. 初识中间件Kafka

    初识中间件Kafka Author:SimplelWu 什么是消息中间件? 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件 关注于数据的发送和接 ...

  5. 性能测试--初识Jmeter

    初识Jmeter Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试静态和动 ...

  6. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  7. CGI与FastCGI nginx+PHP-FPM

    本文转载自CGI与FastCGI 1.当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html. ...

  8. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  9. CGI与FastCGI

    当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html.事物总是不 断发展,网站也越来越复杂, ...

随机推荐

  1. OUTLOOK连EXCHANGE,配置POP3时跳出错误问题

    "Authentication failed because outlook doesnt support any Resolved Question: "Authenticati ...

  2. Spring中的事务管理详解

    在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...

  3. java 二叉搜索树

    java二叉查找树实现: 二叉查找树,上图:比根节点小者在其左边,比根节点大者在其右边. 抽象数据结构,上代码: /** * 二叉查找树数据结构(非线程安全): * 范型类型须实现Comparable ...

  4. fuser可以用于系统安全检查。

    fuser可以用于系统安全检查.用fuser查看哪些用户和进程在某些地方作什么:fuser -cu /root 简略显示fuser -muv /mnt3 分列显示

  5. sql server 清除日志

    SQL2008 的收缩日志  由于SQL2008对文件和日志管理进行了优化,所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消: (SQL2005) Backup Log DNNam ...

  6. PySpark关于HDFS文件(目录)输入、数据格式的探讨

    背景   平台HDFS数据存储规则是按照“数据集/天目录/小时目录/若干文件”进行的,其中数据集是依据产品线或业务划分的.   用户分析数据时,可能需要处理以下五个场景:   (一)分析指定数据集.指 ...

  7. ssh 登录出现的几种错误以及解决办法

    首先.确保server端的ssh服务是开的(service shhd start) 然后在client端输入: ssh usrname@serverip (远程登录) scp filename usr ...

  8. ADO.NET 代码示例

    转自:http://msdn.microsoft.com/zh-cn/library/dw70f090 本主题中的代码列表演示如何使用下面的 ADO.NET 技术从数据库中检索数据: ADO.NET ...

  9. 《C程序设计语言现代方法》第5章 选择语句

    关系运算符的优先级低于算术运算符,关系运算符都是左结合的. 判等运算符的优先级低于关系运算符,判等运算符也是左结合的. 逻辑运算符将任何非零值操作数作为真值来处理,同时将任何零值操作数作为假值来处理. ...

  10. JavaScript---网络编程(2)-函数与数组

    上节,学完循环了~ 现在学Javascript的函数和数组. JavaScript语法 每一种语言都有自己的语法规则,JS语法与Java很像,所以学习起来比较容易.JS中也一样有变量,语句,函数,数组 ...