基於windows IIS的C語言CGI WEB服務器環境搭建

【說明】轉自:kikilizhm  http://blog.csdn.net/kikilizhm/article/details/7840719#comments


網頁編程對我來說特別親切,因爲我就是從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。

  1. /****************************  hello.cpp  
  1. 使用C++實現的CGI輸出hello world!   
  1. by kikilizhm  
  2. *****************************/  
  3. #include <iostream.h>  
  4. void main()  
  5. {  
  6.     cout<<"Content-type:text/html\n\n"<<endl;  /* 注意這裏一定要按照這種格式,表示http頭以供瀏覽器識別,後面的\n\n是http中要求的頭和後面的內容必須空一格,                                                  而且必須使用反斜槓,不能使用" /n/n " ,這樣會報錯的,無法識別。 */  
  7.     cout<<"Hello World!"<<endl;  
  8. }  


  1. /********************************hello.c*************** 
  2. 使用C語言實現的CGI輸出加粗的hello world!  
  3. by kikilizhm 
  4. ******************************************************/  
  5. #include <stdio.h>  
  6. int main()  
  7. {  
  8.     printf("Content-type:text/html");  
  9.     printf("\n\n");  
  10.     printf("<b>Hello World!</b>");  
  11. }  

上面分別是使用C++和C語言編寫的hello world 例程,根據個人習慣,然後編譯生成 hello.exe 可執行文件,將擴展名exe改爲cgi,變爲hello.cgi。

現在我們的cgi程序就寫好了,下面我們開始配置iis,看看效果。

2.針對windows xp  的IIS5.1的配置。其實配置很簡單,只要大家看明白其中的根本。

    說明:這裏默認IIS已經安裝好可用(具體安裝IIS的方法可以百度一下,這裏不細說),針對iis5.1我們需要的只是配置一下腳本和可執行文件的執行權限即可。

按照上面說的,exe文件不需要解釋程序,直接執行即可。假設我們網站根目錄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主要是針對大家在調試過程中使用。


[add by sail0323]:

按照kikilizhm的文章,建立了cgi-test網站,但還是無法訪問到或者出現如下錯誤:

進行了以下設置後,就能運行了:










結果:




發佈了62 篇原創文章 · 獲贊 26 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章