cgic 寫CGI程序
CGIC是C語言CGI庫函數,用于編寫CGI程序
CGIC 主要完成以下功能:
* 對數據進行語法分析
* 接收以 GET 和 PSOT 兩種方式發送的數據
* 把 FORM 中的不同域連接成連續的串
* 為檢索 FORM 數據而提供字符串 , 整數 , 浮點以及單項和多項選擇功能
* 為數字字段提供邊界檢測
* 把 CGI 環境變量加載到非空的 C 串中
* 為調試而捕捉 CGI 狀態
如何寫CGIC應用程序
任何cgic 應用程序必須連接到cgic.c,如果在Linux 下可以用Makefile 做這個工作。
因為CGI 程序需要做一些初始化操作,如獲取環境變量,分析數據等,所以cgic 庫提供了自己的main()函數,那自己寫的cgic程序不能再包含main()函數,而必須以cgiMain()函數開始,cgic.c會調用這個函數。當然這個函數名是可以更改的.還要注意的是,自己編寫的cgic 程序必須包含#include<cigi.h>
也就是說cgic,已經做了一些相關的解析工作,在自己的main函數中只要調用cigic 中相應的函數便可。
以下是cigic 庫里自帶的cgic test程序的cgiMain()
[cpp] view plain copy print?
- int cgiMain() {
- #ifdef DEBUG
- LoadEnvironment();
- #endif /* DEBUG */
- /* Load a previously saved CGI scenario if that button
- has been pressed. */
- if (cgiFormSubmitClicked("loadenvironment") == cgiFormSuccess) {
- LoadEnvironment();
- }
- /* Set any new cookie requested. Must be done *before*
- outputting the content type. */
- CookieSet();
- /* Send the content type, letting the browser know this is HTML */
- cgiHeaderContentType("text/html");
- /* Top of the page */
- fprintf(cgiOut, "<HTML><HEAD>\n");
- fprintf(cgiOut, "<TITLE>cgic test</TITLE></HEAD>\n");
- fprintf(cgiOut, "<BODY><H1>cgic test</H1>\n");
- /* If a submit button has already been clicked, act on the
- submission of the form. */
- if ((cgiFormSubmitClicked("testcgic") == cgiFormSuccess) ||
- cgiFormSubmitClicked("saveenvironment") == cgiFormSuccess)
- {
- HandleSubmit();
- fprintf(cgiOut, "<hr>\n");
- }
- /* Now show the form */
- ShowForm();
- /* Finish up the page */
- fprintf(cgiOut, "</BODY></HTML>\n");
- return 0;
- }
- #ifdef DEBUG
- LoadEnvironment();
- #endif /* DEBUG */
一般采用以上方式,調用環境變量用作調試。 可以插入語句:"#define DEBUG 1 將DEBUG模式打開。
cgiHeaderContentType("text/html") 這個函數主要是輸出Content Type Header,告訴瀏覽器返回的是一個html頁面,當然也可以是"image/gif", "image/jpeg" and "audio/wav
外一點就是,cgi程序輸出HTML頁面的方式都是使用printf把頁面一行一行地打印出來,比如cgictest.c中的這一段代碼:
fprintf(cgiOut, "<textarea NAME=\"address\" ROWS=4 COLS=40>\n");
fprintf(cgiOut, "Default contents go here. \n");
fprintf(cgiOut, "</textarea>\n");
上面這段代碼的運行結果就是在頁面上輸出一個textarea。 第一個參數cgiOut實際上就是stdin,所以我們可以直接使用printf,而不必使用fprintf。不過在調試的時候會用到fprintf來重定向輸出
CGI 調試起來比較麻煩,CGIC提供了一個函數可以將環境變量輸入到文件,方便調試。
[cpp] view plain copy print?
- cgiWriteEnvironment("/etc/conf.d/c0/capcgi.dat");