用C写的一个cgi的例子(使用lighttpd)【by joyride】

  看了用C语言进行CGI程序设计(转载)一文后,进行了一下练习,将练习过程记录下来,以资查询。

一. 过程总结

    总的说来,做cgi的过程大致是:

    1. 安装lighttpd

    2. 写lighttpd的配置文件lighttpd.conf。

      (1)使用语句 server.modules = ("mod_cgi") 加入 cgi 模块;

      (2)使用语句 cgi.assign = (".cgi" => "") 设置 cgi 模块的扩展名和解释器。就本语句而言,表示cgi模块的扩展名是“.cgi”且该 cgi 模块不需要特别的解释器来执行。

    3. 写HTML脚本,在脚本中指定表单数据发送给哪个 cgi 程序处理。

       如“<form ACTION="/cgi-bin/mult.cgi">” 表示表单数据发送给 mult.cgi 处理。同时,可以看到该语句也指定了 mult.cgi 所在的具体位置信息(注意这是个相对目录,在下面红字部分有详细说明。)。

   4. 写 cgi 的C源代码并编译(注意编译好的代码要放到表单指定的位置去,如第3步所述。)

       该cgi程序接收第3步中的表单数据并处理。

      (1)不同的表单提交方式(get或post)传送到cgi程序的数据格式是不同的,所以要根据表单提交方式来写cgi中解析表单数据的代码。

      (2)解析好表单数据后,按实际需要写数据处理代码。

      (3)数据处理完毕后,写输出代码。用 printf 按 HTML 语法格式输出结果给浏览器显示。

    5. 测试

二. 具体操作过程记录

环境

    编译主机的系统版本:linux 2.6.27.5-117(fedoral 10)

    编译工具链:GCC4.3.2

    lighttpd 的版本为 2.4.19

过程

1. 安装lighttpd

   参考“在Ubuntu9.04上从源码安装lighttpd【by joyride】

2. 修改配置文件lighttpd.conf(假设放在var.DocRoot(/home/usr948/lighttpd-1.4.19/web)下)

# --- define variables (begin) ---
var.DocRoot = "/home/usr948/lighttpd-1.4.19/web"
var.HostWebPage = "index.html"
var.HttpPort = 1111
# --- define variables (end) ---

# --- set enviroment (begin) ---
server.document-root = var.DocRoot
server.port = var.HttpPort
server.indexfiles = (var.HostWebPage)
mimetype.assign = (".html" => "text/html")
# --- set enviroment (end) ---

# --- add modules (begin) ---
server.modules = ("mod_cgi")
         # Add the cgi module
cgi.assign = (".cgi" => "")
         # ".cgi" - appoint suffix of cgi program;
         # "" - tell lighttpd that the cgi program need not a particular explain program.
# --- add modules (end) ---

3. 修改目录下的启动页面index.html(假设放在var.DocRoot(/home/usr948/lighttpd-1.4.19/web)下)

<html>

<body>

    <form ACTION="/cgi-bin/mult.cgi">
        <P>计算两个数的乘积,请输入两个乘数。
        <INPUT NAME="m" SIZE="5">
        <INPUT NAME="n" SIZE="5"><BR>
        <INPUT TYPE="SUBMIT" values="提交">
    </form>

</body>

</html>

蓝色语句表示form提交的数据被发送给mult.cgi程序处理。注意:给出的cgi程序的位置是相对目录而不是绝对目录,相对目录的根节点由配置文件lighttpd.conf中的server.document-root = var.DocRoot语句给出,所以,最终编译好的cgi程序应该放在目录 /home/usr948/lighttpd-1.4.19/web/cgi-bin 下。

4. 写cgi源代码(假设文件名为mult.c)

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *data;
    long m,n;

    printf("%s\n\n","Content-Type:text/html;charset=gb2312");
    printf("<TITLE>乘法结果</TITLE> ");
    printf("<H3>乘法结果</H3> ");

    data = getenv("QUERY_STRING"); //获得form传来的参数——两个乘数m和n
    if(data == NULL)
        printf("<P>错误!数据没有被输入或者数据传输有问题");
    else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)
        printf("<P>错误!输入数据非法。表单中输入的必须是数字。");
    else
        printf("<P>%ld和%ld的乘积是:%ld。",m,n,m*n);
    return 0;
}

5. 编译源代码

    gcc mult.c -o mult.cgi

    根据4.的说明,必须将编译好的mult.cgi放到 /home/usr948/lighttpd-1.4.19/web/cgi-bin 目录下。

6. 启动lighttpd

    设置当前目录到 /home/usr948/lighttpd-1.4.19/usr/sbin。

    cd /home/usr948/lighttpd-1.4.19/usr/sbin

    执行下面命令:

    ./Lighttpd -f ../../web/lighttpd.conf

7. 在浏览器输入 http://127.0.0.1:1111,回车可看到起始页index.html 。

8. 输入两个乘数(如4和6),点击“Submit Query” 按钮,form的数据将被提交到cgi处理后返回给浏览器显示。


转自 http://hi.baidu.com/id_joyride/item/81242ac39cb76a43a8ba9429

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值