網頁編程對我來說特別親切,因為我就是從html、ASP、PHP一步步接觸編程的。自己的編程愛好也是從那里一點一點被滿足。不過離開大學之后很久沒有碰過WEB了,最近看到嵌入式中的涉及到的web服務器,了解到了CGI編程,就想趕緊試一試。對於cgi,不算接觸,但是還是聽說過之前,對於純粹寫普通網站的人來說CGI卻是很古老的東西了,之前在大學的時候學校的ftp搜索引擎,是一位特別牛b的學長寫的,用的就是C實現CGI。后來我也想做一個,但是由於水平有限,后來也就不了了之。前幾天在南圖想找本關於CGI方面的書竟然都下架了,在網上搜索關於這方面的文章頁很少,且很多是針對perl語言的,所以這里針對C語言的CGI寫點東西。
嵌入式中的WEB服務器,由於嵌入式中主要是用C語言來實現,所以這里只談C語言的CGI,而在嵌入式中的WEB服務器,大家一般選用BOA等,這里為什么選用IIS,主要是因為我們大部分人都是在windows下開發,所以在iis下調試自然是更方便一些。在網上看到很多人在問iis下配置關於C語言的CGI的方法,而網上的全部都是關於Perl的。我經過了兩天的時間在網上一遍一遍的百度和摸索,終於試出來基於windows xp的IIS5.1和windows 7的IIS6.1上的CGI配置方法。
綜述: 關於腳本和可執行程序
在iis中對於動態語言會設計到腳本和可執行程序。對於腳本是需要另外的程序對其進行解釋的,例如perl腳本編寫的CGI就是腳本,需要安裝專門的程序區解釋;而對於可執行程序,例如C語言編寫的.cgi(是c語言編譯出來的.exe程序,將擴展名exe改成cgi),其本身就是可執行程序,不需要另外的程序去解釋,所以網上關於使用TC還是VC的編譯器cl.exe作為可執行程序去配置c語言編寫出來的cgi的說法都是錯誤的。其實CGI的實現就是將本身腳本或者可執行程序的標准輸出,不再是通過屏幕打印,而是經過瀏覽器輸出給客戶端顯示,所以你用一個vc或者tc的編譯器去執行一個.exe的可執行文件是得不到想要的輸出的。正確的作法是不需要和perl語言一樣配置解釋程序,而是配置為讓文件執行。
具體操作:
由於網上針對IIS 和C語言的CGI的內容較少,所以下面的內容一步步用圖片說明。方便向我一樣的初次使用者。
1.編寫CGI程序。
使用任何一種C語言開發工具,TC,VC,C-free均可,C/C++均可。內容我們還是使用經典的hello world。
- /**************************** hello.cpp
- 使用C++實現的CGI輸出hello world!
- by kikilizhm
- *****************************/
- #include <iostream.h>
- void main()
- {
- cout<<"Content-type:text/html\n\n"<<endl; /* 注意這里一定要按照這種格式,表示http頭以供瀏覽器識別,后面的\n\n是http中要求的頭和后面的內容必須空一格, 而且必須使用反斜杠,不能使用" /n/n " ,這樣會報錯的,無法識別。 */
- cout<<"Hello World!"<<endl;
- }
- /********************************hello.c***************
- 使用C語言實現的CGI輸出加粗的hello world!
- by kikilizhm
- ******************************************************/
- #include <stdio.h>
- int main()
- {
- printf("Content-type:text/html");
- printf("\n\n");
- printf("<b>Hello World!</b>");
- }
上面分別是使用C++和C語言編寫的hello world 例程,根據個人習慣,然后編譯生成 hello.exe 可執行文件,將擴展名exe改為cgi,變為hello.cgi。
現在我們的cgi程序就寫好了,下面我們開始配置iis,看看效果。
2.針對windows xp 的IIS5.1的配置。其實配置很簡單,只要大家看明白其中的根本。
說明:這里默認IIS已經安裝好可用(具體安裝IIS的方法可以百度一下,這里不細說),針對iis5.1我們需要的只是配置一下腳本和可執行文件的執行權限即可。
按照上面說的,exe文件不需要解釋程序,直接執行即可。假設我們網站根目錄是www,下www\cgi目錄為腳本存放目錄,我們把hello.cgi文件放到cgi目錄下,這里為演示方便,正常情況下考慮安全等因素,常將存放腳本的目錄使用虛擬目錄掛接,不直接放在網站根目錄下。
然后我們在IIS中右擊cgi目錄,選擇屬性,打開cgi屬性對話框,在目錄選項卡設置讀取、寫入、目錄訪問前的勾去掉。其中讀取是防止在訪問cgi程序時,瀏覽器將cgi文件作為下載文件彈出下載對話框,而不是實際執行顯示在瀏覽器上。寫入和目錄訪問時安全需要。這里特別注意去掉讀取權限。
然后將下方的 ”執行權限“更改為 ”腳本和可執行文件“ ,這里也是重要的一步,不可以用純腳本,一定要有可執行文件權限。點擊確認再確認,重啟IIS即可。
走到這里我們打開瀏覽器,輸入 http://localhost/cgi/hello.cgi ,即可看到hello world的畫面,如果還看不到或者出現其他提示錯誤,一般為網站的訪問權限認證設置有問題,可以嘗試修改文件夾訪問權限。
**************************** ==針對win 7 的IIS6.1的配置== *****************************
3.win7中的IIS界面和windows xp 中的IIS5.1界面發生了很大的變化,IIS 6.1中已經內置有CGI處理模塊,這里我們直接使用即可。
同樣這里我們假設我們IIS6.1已經安裝好,而且可以使用,新建網站名稱:cgi-test,根目錄為www,下面有子目錄cgi用於存放cgi腳本文件。
在左側的cgi-test網站中,我們單擊cgi-test網站的cgi目錄,右側會顯示cgi主頁,我們在右側 IIS 部分雙擊模塊,進入模塊功能,可以看到CgiModule模塊,我們接下來就是要使用的這個模塊來實現我們的cgi功能。
看到這里,我們返回cgi目錄的主頁,雙擊CGI主頁中的”處理程序映射“來配置 cgi文件的映射,在處理程序映射界面,每一條配置的路徑相當於配置的文件擴展名,
狀態為已啟用或者禁用,處理程序即相應的模塊或者腳本解釋程序。 在最右側的操作界面,我們可以看到我們可以選擇的操作,其中包括 添加托管處理程序、添加腳本映射、添加通配符腳本映射,添加模塊映射,和下面的編輯功能權限等。這里我們使用的是添加模塊映射和編輯功能權限。
單擊添加模塊映射,在出現的編譯模塊映射對話框中,按照如圖所示配置,請求路徑輸入 *.cgi ,表示cgi格式文件,模塊選擇CgiModule,可執行文件為空,名稱可以隨便寫,這里為cgi-exe。確定后,增加了cgi-exe配置,然后右擊這條配置選擇編譯功能權限,確保有執行權限,然后重啟iis服務。在瀏覽器中輸入地址,即可查看到hello world的打印。
看看我們的成果吧,這里只是打印了最簡單的字符,服務器已經配置好了,大家可以發揮自己的聰明才智,實現自己的功能吧~
總結:
經過大概兩天的時間,終於摸索出了在iis上配置C語言編寫的CGI的方法,其實真正配置下來,花的時間並不多也不復雜,但是由於網上很少人使用iis做C的cgi的服務器,而且網上關於這類問題的回答都是答非所問,甚至是錯誤的說法,所以摸索起來很困難,但是這兩天的時間里,在經歷了從最初的沒有頭緒,到最后的思考網上很多人在說的perl語言的cgi和c語言的cgi的區別,去甄別那些錯誤的信息,並且從那些錯誤的信息里找出來對我又幫助的地方,比如剛開始的時候使用vc的編譯器cl.exe去執行,並沒有得到想要的結果,於是去嘗試vc的bin目錄下的其他程序,在有的程序返回了一部分字符的時候,在瀏覽器的錯誤信息里顯示了錯誤的http頭,比之前的空的頭還是有點幫助,畢竟有了顯示,雖然是個錯誤信息。然后嘗試着用cmd.exe去執行,最后的最后確信不適用程序去執行,后面會出現訪問cgi的時候出現下載的問題,用文本方式打開下載的文件,雖然也是和服務器端一樣的名稱,但是下載的文件內容已經是個文本,里面就是執行打印出來的信息,只是它被下載下來了,而不是在瀏覽器中顯示,后來在網上看到了一個朋友發的msdn社區上的說明,需要去掉讀取權限,這才恍然大悟。然后就看到了親切的打印信息了。
即使一個一開始不明白或者沒有涉及到的問題,不斷的去想解決它,即使沒有進展,但是對於你對問題的理解還是有很大幫助的,我想這和那種做夢發現苯環之類的是一樣的道理。同時也是一種學習的方式,對於一種技術一下子接受不了的時候,可以先看一部分,了解一下,或者強迫自己先學,然后放置一段時間,再回頭在學,就會發現很輕松了。
該睡覺了,希望這里能對大家起到幫助作用,另外,在使用的過程中,推薦大家使用合適的環境,比如在apache中配置cgi更加的簡單和安全。針對IIS上的C語言的CGI主要是針對大家在調試過程中使用。