1. 程式人生 > >第一個CGI程序-----完全就是普通的c語言嘛‘(*∩_∩*)′

第一個CGI程序-----完全就是普通的c語言嘛‘(*∩_∩*)′

同學 pat gree ostream 出現 targe 普通 get 方便

第一個CGI程序

————完全就是普通的C語言嘛

‘(*∩_∩*)′ PainterQ 2017年5月14日

上一篇博文裏面敘述了Apache的安裝和配置方法,恍恍惚惚我就擁有了自己的第一個http服務器。雖然是局域網下的網站但給同學們開開車還是完全夠了(咳咳)。好像是有了Apache再把HTTP文檔丟到htdocs文件夾就可以了,老司機的工作竟然如此輕松。其實還有很多的姿勢都還沒有掌握哦,不追求新姿勢的人生和鹹魚有什麽分別!就是老司機也要做姿勢最多的那一個。這一篇我們一起來了解一下什麽是動態網頁,什麽是CGI。

1.動態網頁?那麽CGI是什麽呢

  當網站越來越大,人們終於一如以往的怠惰起來。那一天,大家終於厭煩了一遍遍的制作相似的HTML文檔,抱怨著兩個文檔只有少許的不同就要重寫一分,他們開始感到被HTML支配的恐懼,空氣的絲縷間溢出的都是絕望的氣息。一個俊俏的少年看著無力的人們,說“為什麽不寫個程序或者腳本來產生HTML呢?”。只一句,濃霧炸裂,日月恢復了昔日的光華。

  能夠根據用戶的請求動態生成的網頁就是動態網頁(而不是利用Javascript實現動態交互的網頁)。現在已經到處都是這種方法的影子,哪些以.asp、.jsp、.php、.cgi等結尾的頁面便是動態生成的(不也這些結尾不代表就不是)。當用戶向服務器請求時,服務器根據請求的參數調用運行在服務器上的外部程序來生成頁面內容(可以想象這個程序就是一般的程序或腳本,他也許僅僅是處理請求的內容,他也許要訪問數據庫,他可以做他想做的一切)。CGI是一種接口,他說明了外部程序如何被服務器調用。具體的就是,參數如何傳入,處理後的信息如何返回。一般說"CGI程序"是指用C/C++寫成的*.cgi程序(就是把編譯後的*.exe直接改後綴為*.cgi。實際上我才不管你是什麽語言,只要編譯成.exe就行)。但是嚴格地講CGI不是指哪一種語言寫成的程序或腳本,而是凡是能滿足CGI接口的語言寫成的程序或腳本都叫CGI程序,可以是PHP,python等。

2.環境變量 和 標準輸入輸出

  一次web請求在HTTP層面就是三部分:請求行、消息報頭、請求正文(下一篇博文討論HTTP協議,歡迎賞光)。請求行和消息報頭的一些信息通過環境變量傳遞給CGI程序,請求正文則以標準輸入的方式傳給CGI程序,最後,輸出消息以標準輸出的方式傳出並使用HTTP協議發送給客戶(當然可以沒有輸出)。標準輸入輸出大家一定不陌生,就是printf(),cin,cout。環境變量是操作系統層面的"全局變量",任何程序都可以註冊新的環境變量或訪問已有的環境變量,正因如此環境變量成為進程之間交互的一種方式。

  在stdlib.h中聲明了庫函數getenv()用於根據環境變量的名字(char*)獲取環境變量,原型如下

char * getenv(const char *name);

  舉個例子吧,裝過JAVA的都知道要設置一個名叫Path的環境變量,我們就用這個函數來獲取Path的內容,僅作為該函數的演示。

1 #include <cstdlib>
2 #include <iostream>
3 int main()
4 {
5     std::cout << getenv("path")<<std::endl;
6     return 0;
7 }

技術分享

圖1.運行結果

  如果本程序編譯出現問題,請參看:解決This function or variable may be unsafe

3.第一個CGI程序

  CGI需要用到的環境變量有哪些呢,我們來寫第一個CGI程序,它的功能就是返回所有的需要用到的環境變量。這些環境變量其實很多都是HTTP協議的報頭,歡迎參看:HTTP協議解析。

  首先定義一個結構數組以方便一會輸出,如圖。

技術分享
for (int i = 0; i < 19; i++) {
        std::cout << "<li style = \"color:blue\">";
        _dupenv_s(&env, &length, nevName[i].name.c_str());
        std::cout << nevName[i].name << :;
        if (env == nullptr) {
            std::cout << "<br/>";
        }else {
            std::cout <<"<span style = \"color:green\">" <<env
       std::cout <<"</span>"<< "<br/>"; }
//使用一個循環依次輸出各項的內容

     圖2.定義結構數組

  編譯後把exe文件放到Apache的cgi-bin文件夾中,再寫一個HTML來請求這個程序。並把文件放到htdocs文件夾。

<html>
<head><title>第一個CGI</title></head>
<body>
<form   action = "/cgi-bin/firstCGI.cgi" method="post">
<input type ="submit">
</form>
</body>
</html>

  執行結果:

技術分享    

          圖3.點擊按鈕之前

技術分享

                    圖4.點擊提交之後

第一個CGI程序-----完全就是普通的c語言嘛‘(*∩_∩*)′