用 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 protected]
好了,一切就是這樣簡單!要開發更好的 CGI 程序就要靠您的 C/C++ 的功力了。歡迎指教!
此文轉載自網絡文章!