<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-40  評論-66  文章-0  trackbacks-0
    我們來看看到底如何從POST表單收集數據到CGI程序,下面給出了一個比較簡單的C源代碼:     
        
     

     

    #include<stdio.h>
    #include<stdlib.h>    
    #define MAXLEN 80    
    #define EXTRA 5
    /*   4個字節留給字段的名字"data",   1個字節留給"="   */
    #define   MAXINPUT   MAXLEN+EXTRA+2 
    /*   1個字節留給換行符,還有一個留給后面的NULL   */
    #define DATAFILE "../data/data.txt"
    /*   要被添加數據的文件   */

    void   unencode(char   *src,   char   *last,   char   *dest)
    {
     for(; src != last; src++, dest++)
      if(*src == "+")
       *dest = " ";
      else if(*src == "%") {    
       int   code;    
       if(sscanf(src+1,"%2x",&code)!=1)code="?";
       *dest=code;
       src   +=2;}
      else
       *dest=*src;
      *dest=" ";
      *++dest="";    
    }    

    int   main(void)    
    {    
     char *lenstr;
     char input[MAXINPUT], data[MAXINPUT];
     long len;
     
     printf("%s%c%c", "Content-Type:text/html;charset=gb2312",13,10);
     printf("<TITLE>Response</TITLE>");

     lenstr=getenv("CONTENT_LENGTH");
     if(lenstr==NULL || sscanf(lenstr,"%ld",&len)!=1 || len>MAXLEN)
      printf("<P>表單提交錯誤");
     else{
      FILE *f;
      fgets(input,   len+1,   stdin);
      unencode(input+EXTRA,   input+len,   data);

      f =fopen(DATAFILE, "a");
      if(f == NULL)    
       printf("<P>對不起,意外錯誤,不能夠保存你的數據");    
      else
       fputs(data,   f);    
      fclose(f);
      printf("<P>非常感謝,您的數據已經被保存<BR>%s",data);    
     }    
     return   0;    
    }    

        
           從本質上來看,程序先從CONTENT_LENGTH環境變量中得到數據的字長,然后讀取相應長度的字符串。因為數據內容在傳輸的過程中是經過了編碼的,所以必須進行相應的解碼。編碼的規則很簡單,主要的有這幾條:     

    1.   表單中每個每個字段用字段名后跟等號,再接上上這個字段的值來表示,每個字段之間的內容用&連結;    2.   所有的空格符號用加號代替,所以在編碼碼段中出現空格是非法的;    
    3.   特殊的字符比如標點符號,和一些有特定意義的字符如“+”,用百分號后跟其對應的ACSII碼值來表示。    

    例如:如果用戶輸入的是:     
       
    Hello   there!    

    那么數據傳送到服務器的時候經過編碼,就變成了data=Hello+there%21   上面的unencode()函數就是用來把編碼后的數據進行解碼的。在解碼完成后,數據被添加到data.txt文件的尾部,并在瀏覽其中回顯出來。    

    把文件編譯完成后,把它改名為collect.cgi后放在CGI目錄中就可以被表單調用了。下面給出了其相應的表單:    

    <FORM   ACTION="/cgi-bin/collect.cgi"   METHOD="POST"   >
    <P>請輸入您的留言(最多80個字符):<BR>
    <INPUT   NAME="data"   SIZE="60"   MAXLENGTH="80"   ><BR>
    <INPUT   TYPE="SUBMIT"   VALUE="確定">
    </FORM   >    
       
       
           事實上,這個程序只能作為例子,是不能夠正式的使用的。它漏掉了很關鍵的一個問題:當有多個用戶同時像文件寫入數據是,肯定會有錯誤發生。而對于一個這樣的程序而言,文件被同時寫入的幾率是很大的。因此,在比較正式的留言版程序中,都需要做一些更多的考慮,比如加入一個信號量,或者是借助于一個鑰匙文件等。因為那只是編程的技巧問題,在這兒就不多說了。

    posted on 2008-02-27 13:52 Super·shen BLOG 閱讀(2771) 評論(1)  編輯  收藏

    評論:
    # re: C語言CGI程序 POST表單處理 2008-06-06 19:23 | fdsafd
    fdafds  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲中文字幕久在线| 亚洲三级电影网站| 亚洲AV成人无码久久WWW| 99re热免费精品视频观看| 2022年亚洲午夜一区二区福利| 免费a级黄色毛片| 亚洲AV无码专区亚洲AV桃| 免费v片视频在线观看视频| 国产v精品成人免费视频400条| 女人18毛片特级一级免费视频| 精品国产亚洲男女在线线电影 | 国产成人高清精品免费观看| 精品国产综合成人亚洲区 | 中国亚洲女人69内射少妇| 69成人免费视频| 国产精品成人啪精品视频免费| 亚洲精品国产成人99久久| 日韩激情无码免费毛片| 99在线热播精品免费99热| 久久亚洲精品国产精品婷婷| 亚洲永久无码3D动漫一区| 18禁超污无遮挡无码免费网站国产| 国产精品1024在线永久免费| 亚洲av永久无码精品三区在线4| 久久精品国产亚洲7777| 69成人免费视频无码专区| A级毛片高清免费视频在线播放| 亚洲AV无码资源在线观看| 久久久亚洲精品国产| 免费又黄又硬又爽大片| 国产在线a免费观看| 国产免费无码AV片在线观看不卡| 亚洲爆乳无码专区www| 亚洲精品免费在线| 国精无码欧精品亚洲一区| 免费日本黄色网址| 成人免费视频一区二区三区| 四虎国产精品永久免费网址| 国产精品免费久久久久影院| 亚洲成AV人影片在线观看| 亚洲精品国产精品国自产网站 |