• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            doing5552

            記錄每日點滴,不枉人生一世

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              73 Posts :: 0 Stories :: 94 Comments :: 0 Trackbacks

            公告

            常用鏈接

            留言簿(24)

            我參與的團隊

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 454893
            • 排名 - 48

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

                大二的時候就開始接觸CGI了,那時候用perl、php都寫過CGI程序,對CGI的了解

            也浮于表面上,最近由于工作需要,需要用C來寫CGI程序,是時候弄清楚CGI內部的工

            作機制了。

            1. CGI是什么?

              相信很多人和我之前一樣,說到CGI,會熟練的蹦出一句“Common Gateway

            Interface ”,沒錯,這確實是CGI的全稱,可以翻譯為“通用網(wǎng)關接口”,可一說到它的

            用處,有多少人能夠講清楚? 沒關系,現(xiàn)在我就幫大家來解決這個困惑。按照CGI 1.1

            里面的說法“The Common Gateway Interface (CGI) is a simple interface for

            running external programs, software or gateways under an information server in

            a platform–idependent manner. Currently, the supported information servers

            are HTTP servers.”,和我們熟悉的一樣,CGI現(xiàn)在都用在http服務器上,那么CGI能夠

            提供怎樣的便利呢?答案如下:“A plain HTML document that the Web daemon

            retrieves is static, which means it exists in a constant state: a text file

            that doesn’t change. A CGI program, on the other hand, is executed in

            real-time, so that it can output dynamic information.”

            2. CGI接口定義

                目前關于CGI接口最新的版本是1.1, 既然CGI程序充當?shù)慕巧且粋€Gateway,那么

            這個Gateway的兩端是什么?沒錯,是Http Server(Web Server)的輸入和輸出,換句話說

            ,CGI程序從Web Server那里獲得瀏覽器發(fā)過來的數(shù)據(jù),進行相應處理后,輸出瀏覽器識別

            的html文本給Web Server。為了便于理解, 還是用流程圖示意一下。

             client                   Web Server             CGI程序    
                
                   http協(xié)議                         CGI接口
            發(fā)送請求---->接受請求并將數(shù)據(jù)處理發(fā)送給CGI程序--->獲得處理過的數(shù)據(jù)并解析
                                                           
            接受數(shù)據(jù)<----獲得CGI返回的數(shù)據(jù)并發(fā)送給客戶端<---處理數(shù)據(jù)并返回html數(shù)據(jù)

                        圖 1

            本文討論的重點就是這個CGI接口, CGI程序通過環(huán)境變量和標準輸入獲得數(shù)據(jù),通過標

            準輸出和標準錯誤輸出發(fā)送數(shù)據(jù),那么這個到底是怎么實現(xiàn)的呢?

            3. CGI接口實現(xiàn)

            其實Web Server和CGI程序就是兩個進程,要實現(xiàn)CGI接口就是如何實現(xiàn)這兩個進程的通信

            ,Web Server獲得瀏覽器發(fā)送過來的請求后,將數(shù)據(jù)做相應處理,然后fork一個子進程處

            理客戶請求,子進程組織相應的環(huán)境變量和參數(shù)準備傳遞給CGI程序,然后調用execvp執(zhí)

            行CGI程序。CGI程序有自己的環(huán)境變量,就是如上實現(xiàn)的,第二節(jié)說過,CGI程序除了通

            過環(huán)境變量獲得數(shù)據(jù)外(其實這是get方法獲取數(shù)據(jù)的手段),還通過標準輸入獲得數(shù)據(jù)(pos

            t方法獲取數(shù)據(jù)的方法),并且返回的數(shù)據(jù)是發(fā)送到標準輸出。相信你和我之前有一樣的疑

            問,為什么CGI程序能夠從標準輸入、標準輸出讀寫數(shù)據(jù)?其實這是通過管道和dup2系統(tǒng)

            調用實現(xiàn)的,見下面的示意圖:

                                           _____________________
                                      dup2|                     |
            (CGI program)read<-stdin<--|p[0]--管道1--p[1]|<-write (http server)
                                          |_____________________|

                                        圖2: CGI讀的實現(xiàn)
                                             _____________________
                                        dup2|                     |
            (CGI program)write->stdout-->|p[1]--管道2--p[0]|->read (http server)
                                            |_____________________|

                                        圖3: CGI寫的實現(xiàn)

            4. 如何寫CGI程序

                有了上述的講述后,應該算基本熟悉CGI的內幕了,這樣寫起CGI程序也會得心應手,

            首先獲得相應的環(huán)境變量并保存,然后就是數(shù)據(jù)處理,根據(jù)REQUEST_METHOD環(huán)境變量判斷

            表單提交的方法是GET還是METHOD,如何是GET,則從QUERY_STRING里面獲取數(shù)據(jù),如果是

            POST, 那么從stdin讀取長度CONTENT_LENGTH的數(shù)據(jù)。下面就是數(shù)據(jù)處理,組織html的輸

            出頁面,并用printf輸出。

            5. 小結

                上面講的其實只是一個概況,關于CGI的接口有興趣的可以去看看這兩個網(wǎng)頁:

            http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html 
            http://hoohoo.ncsa.uiuc.edu/cgi/intro.html
                我敘述的可能有些地方也有問題,歡迎提出! 另外關于CGI實現(xiàn)的代碼可以看看

            開源軟件"thttpd",這是一個輕量級的http server,實現(xiàn)的很講究,主頁在

                http://www.acme.com/software/thttpd/

              完畢!

            posted on 2010-07-13 13:41 doing5552 閱讀(1063) 評論(0)  編輯 收藏 引用
            狠狠色丁香久久综合婷婷| 午夜精品久久久久久久久| 四虎国产精品免费久久5151| 久久精品国产亚洲av水果派 | 女同久久| 亚洲AV无码一区东京热久久| 国产精品久久国产精品99盘 | 久久久久久精品久久久久| 国产精品一久久香蕉国产线看观看 | 77777亚洲午夜久久多喷| 久久精品人人做人人爽电影| 久久996热精品xxxx| 亚洲人成伊人成综合网久久久| 久久久91精品国产一区二区三区 | 久久久久无码精品国产| 国产 亚洲 欧美 另类 久久| 色天使久久综合网天天| 国内精品欧美久久精品| 久久久精品人妻一区二区三区四 | 久久久噜噜噜久久中文福利| 日韩一区二区三区视频久久| 久久国产精品-国产精品| 人妻无码精品久久亚瑟影视| 久久精品国产第一区二区| 国产精品久久久久影视不卡| 久久精品国产精品亚洲精品| 日韩久久久久中文字幕人妻| 日韩一区二区久久久久久| 99精品国产在热久久| 人妻无码αv中文字幕久久| 狠狠色婷婷久久综合频道日韩| 欧美久久亚洲精品| 国产亚洲精午夜久久久久久| 嫩草影院久久99| 久久最近最新中文字幕大全 | 一本久久a久久精品综合香蕉| 国产激情久久久久影院老熟女| 久久99精品国产99久久| 品成人欧美大片久久国产欧美| 久久国产乱子精品免费女| AV狠狠色丁香婷婷综合久久|