jasmine214--love

          只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
          posts - 731, comments - 60, trackbacks - 0, articles - 0

          CGI程序的編寫

          Posted on 2010-07-28 16:47 幻海藍夢 閱讀(1282) 評論(0)  編輯  收藏 所屬分類: Linux

          原文:http://blog.donews.com/mutecat/archive/2006/10/28/1068602.aspx
          其實大一的時候就開始接觸CGI了,CGI(Common Gateway Interface: 公用網關接口)規定了Web服務器調用其他可執行程序(CGI程序)的接口協議標準,由此可見,CGI程序需要httpd服務器的支持。Linux下比較流行用perl和php來寫CGI程序,CGI程序需要大量的字符處理工作,perl和php對字符的處理都非常簡單。但是有時也用C語言或者其他一些語言來寫,C語言寫CGI相對比較復雜,大家知道C對字符串的處理是相當復雜的,但是用C語言編寫的CGI程序具有執行速度快、安全性高等特點。

          CGI接口標準包括標準輸入、環境變量、標準輸出三部分。

          綠體部分摘自http://www.7dspace.com/doc/19/2005-08-17/200581702512452703.htm

          1.標準輸入
            CGI程序像其他可執行程序一樣,可通過標準輸入(stdin)從Web服務器得到輸入信息,如Form中的數據,這就是所謂的向CGI程序傳遞數據的POST方法。這意味著在操作系統命令行狀態可執行CGI程序,對CGI程序進行調試。
          2.環境變量
          ?????? 操作系統提供了許多環境變量,它們定義了程序的執行環境,應用程序可以存取它們。Web服務器和CGI接口又另外設置了自己的一些環境變量,用來向CGI程序傳遞一些重要的參數。CGI的GET方法還通過 環境變量QUERY-STRING向CGI程序傳遞Form中的數據。
          3.標準輸出
            CGI程序通過標準輸出(stdout)將輸出信息傳送給Web服務器。傳送給Web服務器的信息可以用各種格式,通常是以純文本或者HTML文本的形式,這樣我們就可以在命令行狀態調試CGI程序,并且得到它們的輸出。

          從上面可以看出CGI獲取input的方法有兩種:環境變量(get),讀stdin(post)

          下面是CGI程序設計中常常要用到的一些環境變量。
            HTTP-REFERER:調用該CGI程序的網頁的URL。
            REMOTE-HOST:調用該CGI程序的Web瀏覽器的機器名和域名。
            REQUEST-METHOD:指的是當Web服務器傳遞數據給CGI程序時所采用的方法,分為GET和POST兩種方法。GET方法僅通過環境變量(如QUERY-STRING)傳遞數據給CGI程序,而POST方法通過環境變量和標準輸入傳遞數據給CGI程序,因此POST方法可較方便地傳遞較多的數據給CGI程序。

            SCRIPT-NAME:該CGI程序的名稱。
            QUERY-STRING:當使用GET方法時,Form中的數據最后放在QUERY-STRING中,傳遞給CGI程序。
            CONTENT-TYPE:傳遞給CGI程序數據的MIME類型,通常為″applica tion/x-www-form-url encodede″,它是從HTML Form中以POST方法傳遞數據給CGI程序的數據編碼類型,稱為URL編碼類型。
            CONTENT-LENGTH:傳遞給CGI程序的數據字符數(字節數)。

          CGI處理的C語言程序大概如下:

          n=atoi(getsenv("CONTENT_LENGTH"));??//獲取傳遞給程序的字節數
          ?if(n>5000000) n=5000000;
          ?buf=calloc(n+1, 1);
          ?if(buf==0) http_fatal("memory overflow");
          ?fread(buf, 1, n, stdin);????????????//從標準輸入讀取數據(post)
          ?buf[n]=0;
          ?t2=strtok(buf, "&");???????????????? //?的確是post,進行數據處理
          ?while(t2) {
          ??t3=strchr(t2, ‘=’);
          ??if(t3!=0) {
          ???t3[0]=0;
          ???t3++;
          ???__unhcode(t3);
          ???parm_add(trim(t2), t3);
          ??}
          ??t2=strtok(0, "&");
          ?}
          ?strsncpy(buf2, getsenv("QUERY_STRING"), 1024);??//從環境變量里面獲取數據(get)
          ?t2=strtok(buf2, "&");????????????????????????????????????????????????????????? //的確是get,進行數據處理
          ?while(t2) {
          ??t3=strchr(t2, ‘=’);
          ??if(t3!=0) {
          ???t3[0]=0;
          ???t3++;
          ???__unhcode(t3);
          ???parm_add(trim(t2), t3);
          ??}
          ??t2=strtok(0, "&");
          ?}

          參考文檔:

          http://ind.ntou.edu.tw/~dada/cgi/CGIprog.htm

          http://www.7dspace.com/doc/19/2005-08-17/200581702512452703.htm

          主站蜘蛛池模板: 靖安县| 吉安市| 柞水县| 新巴尔虎右旗| 吉木乃县| 正阳县| 理塘县| 行唐县| 清水河县| 乐平市| 固始县| 嘉禾县| 皮山县| 馆陶县| 尖扎县| 商南县| 湘阴县| 九江县| 股票| 巴南区| 临海市| 民乐县| 涞水县| 翁源县| 奈曼旗| 舞阳县| 葵青区| 肇州县| 永胜县| 手游| 东乡县| 奉节县| 洱源县| 邮箱| 呼玛县| 沂南县| 建始县| 封丘县| 即墨市| 漯河市| 万年县|