開發基於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
單擊提交查詢內容後顯示了計算結果