1. 程式人生 > >開發基於Apache伺服器上的CGI程式

開發基於Apache伺服器上的CGI程式

上一節中成功的搭建了Apache伺服器,這節將介紹使用C語言開發能在Apache伺服器上執行的CGI程式

安裝好Apache伺服器後,在C:\Program Files\Apache Software Foundation\Apache2.2下有一些用於開發Apache伺服器的檔案

檔案介紹:

bin:Apache伺服器軟體所在地

cgi-bi:儲存C語言寫的程式

conf:儲存伺服器設定的資訊

error:網站傳送錯誤的處理

htdcocs:儲存HTML程式

icons:儲存開發Apache程式用的圖示

include:儲存開發web程式用到的一些標頭檔案

lib:儲存的是開發web程式用到的一些庫

logs:日誌

manual:Apache伺服器語言的設定

modlules:儲存一些動態連結庫

程式例項1:開發一個CGI版的hello world程式

開發工具:VS2012  Apache伺服器

開發步驟:

首先使用VS2012編譯下面的程式碼

#include <stdio.h>

void main()
{
    //設定HTML語言
    printf("Content-type:text/html\n\n");

    //列印hello world, 我來自CGI
    //html中的換行符為<br>
    printf("hello world, 我來自CGI !<br>");
}

編譯成功後在工程目錄下的Debug資料夾中會有一個exe格式的可執行檔案,我編譯的程式中生成的是CGI程式設計.exe

將exe檔案複製到C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin目錄下,並且修改檔案的格式,將CGI程式設計.exe改成hello.cgi

程式例項2:遍歷Apache伺服器中所有的環境變數

首先使用VS2012編譯下面的程式碼

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

void main()
{
    //設定HTML語言
    printf("Content-type:text/html\n\n");

    printf("Eviroments:<br>");

    //用於儲存環境變數
    extern char** environ;

    //遍歷CGI中的所有環境變數
    for(int i=0; ;i++)
    {
        if(NULL == environ[i])
        {
            break;
        }

        //列印CGI中所有的環境變數
        printf("%s<br>", environ[i]);
    }
}


將exe檔案複製到C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin目錄下,並且修改檔案的格式,將CGI程式設計.exe改成eviroments.cgi


程式例項3:使用環境變數獲得伺服器的型別

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

void main()
{
    //設定HTML語言
    printf("Content-type:text/html\n\n");

    printf("%s ",getenv("SERVER_SOFTWARE"));
}

執行結果:

程式例項4:使用環境變數輸出web資訊

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

void main()
{
    //設定HTML語言
    printf("Content-type:text/html\n\n");

    //遞交表單的瀏覽器的名稱、版本   和其他平臺性的附加資訊。
    printf("%s<br><br>",getenv("HTTP_USER_AGENT"));

    //CGI指令碼執行時的主機名和IP地址
    printf("%s<br><br>",getenv("SERVER_NAME"));

    //你的伺服器的型別如:
    printf("%s<br><br>",getenv("SERVER_SOFTWARE"));

    //指向這個CGI指令碼的路徑,
    printf("%s<br><br>",getenv("SCRIPT_NAME"));

    //遞交指令碼的主機名,這個值不能被設定.
    printf("%s<br><br>",getenv("REMOTE_HOST"));
     
    //遞交指令碼的主機IP地址.
    printf("%s<br><br>",getenv("REMOTE_ADDR"));
      
    //執行CGI的版本
    printf("%s<br><br>",getenv("GATEWAY_INTERFACE")); 
      
    //伺服器執行的TCP口.
    printf("%s<br><br>",getenv("SERVER_PORT"));

    //伺服器執行的HTTP協議.
    printf("%s<br><br>",getenv("SERVER_PROTOCOL"));
}

執行結果:

程式例項5:在網頁中新增超連結

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

void main()
{
    //設定HTML語言
    printf("Content-type:text/html\n\n");

    printf("<a href='http://www.baidu.com'>www.baidu.com</a>");
}

執行結果:

程式例項6:使用環境變數實現引數傳遞

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

void main()
{
    //設定HTML語言
    printf("Content-type:text/html\n\n");

    char Name[256];

    //使用環境變數獲得傳遞的引數
    char* queryString = getenv("QUERY_STRING");

    //把一個字串解析到另一個字串中
    //將獲得的字串中的%s列印到cName中
    sscanf(queryString, "name=%s", Name);
    
    //列印傳遞的引數
    printf("hello %s<br>", Name);
}

使用VS2012編譯上面的程式碼,編譯成功後,在工程目錄下的Debug資料夾中會有一個exe檔案,將exe檔案修改成name.cgi,並且複製到C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin中

執行結果

程式例項7:使用環境變數傳遞多個引數

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

void main()
{
    //設定HTML語言
    printf("Content-type:text/html\n\n");

    int i1,i2;//定義2個變數用於接收傳遞的引數

    //使用環境變數獲得傳遞的引數
    char* queryString = getenv("QUERY_STRING");

    //把一個字串解析到另一個字串中
    //將獲得的字串中的%s列印到cName中
    sscanf(queryString, "i1=%d&i2=%d", &i1, &i2);

    printf("%d+%d=%d", i1, i2, i1+i2);
}
使用VS2012編譯上面的程式碼,編譯成功後,在工程目錄下的Debug資料夾中會有一個exe檔案,將exe檔案修改成sum.cgi,並且複製到C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin中

執行結果



程式例項8:在CGI中使用HTML

在記事本中輸入下面的HTML語言,並且以HTML格式儲存

<html>
<body>
    <form method=get action="http://localhost/cgi-bin/sum.cgi">
       i1:<input type="text" name="i1"/>
       i2:<input type="text", name="i2"/>
       <input type="submit"/>
     </form>
</body>
</html>

將儲存好的HTML檔案放在C:\Program Files\Apache Software Foundation\Apache2.2\htdocs目錄下

執行結果:


計算11+12的結果

在輸入框中輸入11和12

單擊提交查詢內容後顯示了計算結果