c語言之cgi

CGI是Common Gateway Interface的縮寫,翻譯成中文就是通用網關接口,它是網頁的後臺處理程序,運行在服務器端上,可以用多種語言書寫,最常用的就是Perl(因爲Perl有強大的字符串處理功能,而CGI程序經常要處理許多的字符串)。舉個例子來說,通常一般的論壇或郵箱等都需要註冊,需要用戶輸入用戶名和密碼,首先給你一個靜態的頁面,上面有兩個文本框,要求你輸入用戶名和密碼,還有一個提交和重置的按鈕,用於提交用戶的輸入,當用戶點擊提交按鈕時,這個請求就被髮送到服務器端,服務器上的CGI程序就會解析用戶的輸入,並且驗證用戶的輸入是否合法,是否被通過驗證等。下面看一個非常簡單的例子,代碼是最好的解說:

<html>
<head><title>用戶登陸驗證</title></head>
<body>
<form name="form1" action="/cgi-bin/output.cgi" method="POST">
<table align="center">
    <tr><td align="center" colspan="2"></td></tr>
    <tr>
       <td align="right">用戶名</td>
       <td><input type="text" name="Username"></td>
    </tr>
    <tr>
       <td align="right">密&nbsp;&nbsp;碼</td>
       <td><input type="password" name="Password"></td>
    </tr>
    <tr>
       <td><input type="submit" value="登  錄"></td>
       <td><input type="reset" value="取  消"></td>
    </tr>
</table>
</form>
</body>
</html>

-------------------------以下是cgi處理程序的源碼----------------------------

/* output.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

char* getcgidata(FILE* fp, char* requestmethod);

int main()

{

       char *input;

       char *req_method;

       char name[64];

       char pass[64];

       int i = 0;

       int j = 0;

      

//     printf("Content-type: text/plain; charset=iso-8859-1/n/n");

       printf("Content-type: text/html/n/n");

       printf("The following is query reuslt:<br><br>");

 

       req_method = getenv("REQUEST_METHOD");

       input = getcgidata(stdin, req_method);

 

       // 我們獲取的input字符串可能像如下的形式

       // Username="admin"&Password="aaaaa"

       // 其中"Username="和"&Password="都是固定的

       // 而"admin"和"aaaaa"都是變化的,也是我們要獲取的

      

       // 前面9個字符是UserName=

       // 在"UserName="和"&"之間的是我們要取出來的用戶名

       for ( i = 9; i < (int)strlen(input); i++ )

       {

              if ( input[i] == '&' )

              {

                     name[j] = '/0';

                     break;

              }                  

              name[j++] = input[i];

       }

 

       // 前面9個字符 + "&Password="10個字符 + Username的字符數

       // 是我們不要的,故省略掉,不拷貝

       for ( i = 19 + strlen(name), j = 0; i < (int)strlen(input); i++ )

       {

              pass[j++] = input[i];

       }

       pass[j] = '/0';

 

       printf("Your Username is %s<br>Your Password is %s<br> /n", name, pass);

      

       return 0;

}

 

char* getcgidata(FILE* fp, char* requestmethod)

{

       char* input;

       int len;

       int size = 1024;

       int i = 0;

      

       if (!strcmp(requestmethod, "GET"))

       {

              input = getenv("QUERY_STRING");

              return input;

       }

       else if (!strcmp(requestmethod, "POST"))

       {

              len = atoi(getenv("CONTENT_LENGTH"));

              input = (char*)malloc(sizeof(char)*(size + 1));

             

              if (len == 0)

              {

                     input[0] = '/0';

                     return input;

              }

             

              while(1)

              {

                     input[i] = (char)fgetc(fp);

                     if (i == size)

                     {

                            input[i+1] = '/0';

                            return input;

                     }

                    

                     --len;

                     if (feof(fp) || (!(len)))

                     {

                            i++;

                            input[i] = '/0';

                            return input;

                     }

                     i++;

                    

              }

       }

       return NULL;

}

    上面的第一個是一個靜態html頁面,要求用戶輸入用戶名和密碼,當戶輸入之後,點擊“登錄”按鈕,則用戶的輸入就被提交到服務器,由output.cgi來處理,在這裏,只是作爲一個演示,output.cgi把用戶的輸入顯示在頁面上。

    操作提示:將第一段HTML代碼拷貝到一個文本文件,另存爲login.htm,注意擴展名要用htm或者html,第二段代碼是c語言源代碼,筆者在VC++6.0下編譯通過,生成文件爲output.exe,將其改名爲output.cgi,login.htm放在網站的目錄,output.cgi放在網站的cgi-bin目錄。筆者用的是Apache服務器,將login.htm放在了htdocs下面,將output.cgi放在了cgi-bin目錄。在瀏覽器輸入
http://127.0.0.1/login.htm
就會出現

                                                                     
 
用戶名
密  碼

 

這樣頁面,當用戶輸入了用戶名和密碼之後,點擊“登錄”按鈕,就會出現下面的頁面
The following is query reuslt:

Your Username is admin
Your Password is admin888

這裏我們假設在用戶名文本框裏輸入的是"admin",在密碼框裏輸入的是"admin888"。
需要說明是要在本機上運行該cgi程序,需要裝支持cgi的Web服務器,最常見的免費Web服務器就是apache,這個很容易下載到。安裝之後,基本不需要做任何的配置,把login.htm放在htdocs目錄下面,把output.cgi放在cgi-bin目錄下,啓動web服務器後,就可以解釋cgi程序了。

筆者也剛接觸,寫的很粗糙,如有不適之處,望廣大網友批評指正。

http://blogold.chinaunix.net/u/5391/showart_265981.html

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章