免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
【轉(zhuǎn)】c++ web編程:寫出你的CGI程序

【轉(zhuǎn)】c++ web編程:寫出你的CGI程序

分類: C/C++ 63人閱讀 評論(0) 收藏 舉報(bào)

轉(zhuǎn)自:http://www.cnblogs.com/moonlove/archive/2012/02/22/2509147.html

英文原文地址:http://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm

一 什么是CGI

      CGI(The Common Gateway Interface):通用網(wǎng)關(guān)接口,定義web服務(wù)器和客戶腳本進(jìn)行信息交互的一系列標(biāo)準(zhǔn)。

 二 web瀏覽器

         為了了解CGI的概念,讓我們來看看當(dāng)我們單擊一個(gè)超鏈接來瀏覽一個(gè)特定的web頁或URL的時(shí)候,背后會發(fā)生什么事?

      (1)瀏覽器首先會鏈接HTTP web 服務(wù)器并且請求一個(gè)URL 頁面;

      (2) WEB服務(wù)器將會解析這個(gè)URL并且查詢請求的文件名,如果找到了請求文件服務(wù)器就會將這個(gè)文件發(fā)送回瀏覽器,否則發(fā)送回一個(gè)包含錯(cuò)誤信息提示的頁面指示你請求的是一個(gè)服務(wù)器并不包含的文件。

      (3)WEB瀏覽器將接受來自服務(wù)器端的響應(yīng),并且向發(fā)出請求的用戶顯示接收到的文件。

        然而,HTTP服務(wù)器也可能會以如何這種方式進(jìn)行配置,那就是無論什么時(shí)候接受到對特定目錄下的文件的請求,服務(wù)器不會將這個(gè)文件發(fā)送回客戶端,而是它作為一個(gè)程序被服務(wù)器執(zhí)行,并產(chǎn)生出輸出發(fā)送回客戶端瀏覽器進(jìn)行顯示。

        CGI(The Common Gateway Interface)是一個(gè)標(biāo)準(zhǔn)化的協(xié)議,能夠使應(yīng)用程序(通常稱為CGI程序或CGI腳本)同web服務(wù)器和客戶端進(jìn)行交互。CGI程序能夠用Python, PERL, Shell, C or C++等語言來實(shí)現(xiàn)。

三 CGI程序結(jié)構(gòu)圖

       下圖簡單的展示了CGI程序架構(gòu)


四 web服務(wù)器配置

        在你著手寫CGI程序之前,確保你的web服務(wù)器支持CGI程序并且配置成處理CGI程序。所有的能夠被HTTP服務(wù)器執(zhí)行的CGI程序都被存放在預(yù)先配置好的目錄下面,這個(gè)目錄叫做CGI目錄,并且按照約定命名為 /var/www/cgi-bin,并且約定CGI文件的后綴名為.cgi ,盡管它們是c++可執(zhí)行文件。

      一般的,Apache 服務(wù)器在/var/www/cgi-bin目錄下配置文件來運(yùn)行CGI程序,如果你想要聲明另外的目錄來運(yùn)行CGI腳本,你需要修改httpd.conf 文件中的部分內(nèi)容:

  1. <Directory "/var/www/cgi-bin">  
  2.    AllowOverride None  
  3.    Options ExecCGI  
  4.    Order allow,deny  
  5.    Allow from all  
  6. </Directory>  
  7.    
  8. <Directory "/var/www/cgi-bin">  
  9. Options All  
  10. </Directory>  


五 第一個(gè)CGI腳本

以下是一段簡短的CGI腳步代碼

  1. #include <iostream>  
  2. using namespace std;  
  3.    
  4. int main ()  
  5. {  
  6.       
  7.    cout << "Content-type:text/html\r\n\r\n";  
  8.    cout << "<html>\n";  
  9.    cout << "<head>\n";  
  10.    cout << "<title>Hello World - First CGI Program</title>\n";  
  11.    cout << "</head>\n";  
  12.    cout << "<body>\n";  
  13.    cout << "<h2>Hello World! This is my first CGI program</h2>\n";  
  14.    cout << "</body>\n";  
  15.    cout << "</html>\n";  
  16.      
  17.    return 0;  
  18. }  

        編譯上述代碼并且將二進(jìn)制可執(zhí)行文件命名為cplusplus.cgi,保存路徑為/var/www/cgi-bin目錄下,運(yùn)行chmod 755 cplusplus.cgi 命令使得該文件為可執(zhí)行的?,F(xiàn)在,如果你點(diǎn)擊cplusplus.cgi然后就會產(chǎn)生如下輸出:

Hello World! This is my first CGI program

        上面的C++程序是一個(gè)將輸出寫入標(biāo)準(zhǔn)輸出文件(stdout)的簡單程序。這段代碼中有一個(gè)很重要的一點(diǎn)那就是第一行代碼:Content-type:text/html\r\n\r\n,這行被發(fā)送回瀏覽器,指明瀏覽器顯示的文本類型。現(xiàn)在你應(yīng)該了解了CGI的基本概念了,你也可以使用python寫出更多復(fù)雜的CGI程序,C++ CGI程序能與其他任何外部系統(tǒng)進(jìn)行信息交互,例如像RDBMS。

六 HTTP報(bào)文頭部

       這行字符串” Content-type:text/html\r\n\r\n”是發(fā)送回瀏覽器的HTTP報(bào)文頭部的一部分,所有的HTTP報(bào)文頭部都有如下格式:

  1. HTTP Field Name: Field Content  
  2.    
  3. For Example  
  4. Content-type: text/html\r\n\r\n  


下表中包含其他一些重要的HTTP報(bào)文信息,這些信息在CGI編程中經(jīng)常會用到。

HeaderDescription
Content-type:A MIME string defining the format of the file being returned. Example is Content-type:text/html
Expires: DateThe date the information becomes invalid. This should be used by the browser to decide when a page needs to be refreshed. A valid date string should be in the format 01 Jan 1998 12:00:00 GMT.
Location: URLThe URL that should be returned instead of the URL requested. You can use this filed to redirect a request to any file.
Last-modified: DateThe date of last modification of the resource.
Content-length: NThe length, in bytes, of the data being returned. The browser uses this value to report the estimated download time for a file.
Set-Cookie: StringSet the cookie passed through the string

七 CGI環(huán)境變量

所有的CGI程序?qū)褂玫较铝械腃GI環(huán)境變量,這些變量在CGI程序中起著重要的作用。

Variable NameDescription
CONTENT_TYPEThe data type of the content. Used when the client is sending attached content to the server. For example file upload etc.
CONTENT_LENGTHThe length of the query information. It's available only for POST requests
HTTP_COOKIEReturn the set cookies in the form of key & value pair.
HTTP_USER_AGENTThe User-Agent request-header field contains information about the user agent originating the request. Its name of the web browser.
PATH_INFOThe path for the CGI script.
QUERY_STRINGThe URL-encoded information that is sent with GET method request.
REMOTE_ADDRThe IP address of the remote host making the request. This can be useful for logging or for authentication purpose.
REMOTE_HOSTThe fully qualified name of the host making the request. If this information is not available then REMOTE_ADDR can be used to get IR address.
REQUEST_METHODThe method used to make the request. The most common methods are GET and POST.
SCRIPT_FILENAMEThe full path to the CGI script.
SCRIPT_NAMEThe name of the CGI script.
SERVER_NAMEThe server's hostname or IP Address
SERVER_SOFTWAREThe name and version of the software the server is running.

下面這段代碼列出了所有的CGI變量,點(diǎn)擊Get Environment可看結(jié)果。

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. const string ENV[ 24 ] = {                   
  5.         "COMSPEC""DOCUMENT_ROOT""GATEWAY_INTERFACE",     
  6.         "HTTP_ACCEPT""HTTP_ACCEPT_ENCODING",               
  7.         "HTTP_ACCEPT_LANGUAGE""HTTP_CONNECTION",           
  8.         "HTTP_HOST""HTTP_USER_AGENT""PATH",              
  9.         "QUERY_STRING""REMOTE_ADDR""REMOTE_PORT",        
  10.         "REQUEST_METHOD""REQUEST_URI""SCRIPT_FILENAME",  
  11.         "SCRIPT_NAME""SERVER_ADDR""SERVER_ADMIN",        
  12.         "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL",       
  13.         "SERVER_SIGNATURE","SERVER_SOFTWARE" };     
  14.   
  15. int main ()  
  16. {  
  17.       
  18.    cout << "Content-type:text/html\r\n\r\n";  
  19.    cout << "<html>\n";  
  20.    cout << "<head>\n";  
  21.    cout << "<title>CGI Envrionment Variables</title>\n";  
  22.    cout << "</head>\n";  
  23.    cout << "<body>\n";  
  24.    cout << "<table border = \"0\" cellspacing = \"2\">";  
  25.   
  26.    for ( int i = 0; i < 24; i++ )  
  27.    {  
  28.        cout << "<tr><td>" << ENV[ i ] << "</td><td>";  
  29.        // attempt to retrieve value of environment variable  
  30.        char *value = getenv( ENV[ i ].c_str() );    
  31.        if ( value != 0 ){  
  32.          cout << value;                                   
  33.        }else{  
  34.          cout << "Environment variable does not exist.";  
  35.        }  
  36.        cout << "</td></tr>\n";  
  37.    }  
  38.    cout << "</table><\n";  
  39.    cout << "</body>\n";  
  40.    cout << "</html>\n";  
  41.      
  42.    return 0;  
  43. }  
  44.    

八 C++CGI庫

在該FTP服務(wù)器上ftp://ftp.gnu.org/gnu/cgicc/ 提供了C++ CGI庫以供下載,我們從上面下載CGI 庫并一下步驟進(jìn)行安裝:

      $tar xzf cgicc-X.X.X.tar.gz 

$cd cgicc-X.X.X/

$./configure --prefix=/usr

$make

$make install

并且你可以閱讀相關(guān)文檔。C++ CGI Lib Documentation 。

九 GET 與POST方法

        當(dāng)你需要從瀏覽器客戶端傳遞信息至web服務(wù)器端并最終送至CGI程序的時(shí)候,你將必然會遇到很多的問題。大部分的瀏覽器使用兩種方法發(fā)送信息至瀏覽器:GET方法和POST方法,進(jìn)行過WEB開發(fā)的人應(yīng)該對其很熟悉。

        1. 使用GET方法發(fā)送信息

       GET方法將編碼過的用戶信息附加在頁面請求上發(fā)送,頁面請求和這些編碼信息使用?進(jìn)行分割,如下所示:

       http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2

        GET方法是瀏覽器發(fā)送信息之服務(wù)器端所采用的默認(rèn)的方法,采用這種方法發(fā)送時(shí),在你的瀏覽器地址欄上在URL后面會附加上一串字符串,如果你傳輸密碼或其他敏感信息至服務(wù)器端的時(shí)候不要使用GET方法,GET方法有長度限制,在一個(gè)請求字符串中,最多只能發(fā)送1024的字符。

當(dāng)使用GET方法的時(shí)候,HTTP報(bào)文頭采用QUERY_STRING發(fā)送信息,并且將通過QUERY_STRING環(huán)境變量進(jìn)入你的CGI程序。

您能夠使用簡單的鍵-值組合附加在URL后傳遞信息,或者你也可使用HTML中的<FORM>標(biāo)簽通過使用GET方法來傳遞信息。

         2. 使用POST方法發(fā)送信息

        CGI程序中較為通用的且更為可靠地傳遞信息的方法是POST方法,POST傳遞的報(bào)文信息和GET方法沒什么兩樣,但是跟GET方法的將字符串信息附加于URL之后并且用?分隔有所區(qū)別的是,POST方法使用分離的報(bào)文段分別發(fā)送URL和要傳輸?shù)男畔ⅰ_@些信息會被CGI腳本以標(biāo)準(zhǔn)輸入的形式接收。

(注:在原文中作者給出了HTML各種控件傳遞信息給CGI腳本的例子,有興趣的朋友可以去看看)

十 在CGI中使用Cookies

        服務(wù)器可能會以Cookies的形式發(fā)送數(shù)據(jù)給客戶端瀏覽器上,瀏覽器也許會接收這些Cookies,并且會以簡單文本的形式存儲在用戶的硬盤上,當(dāng)用戶訪問該web站點(diǎn)的另外頁面的時(shí)候,這些Cookies就會有用處了,服務(wù)器就會據(jù)此知道用戶記錄了那些信息。

        Cookies信息格式包含如下5個(gè)變量:

     (1) Expires:包含Cookies的過期信息。如果變量值為空,當(dāng)客戶端關(guān)閉瀏覽器時(shí),Cookies就會過期。

    (2)  Domain:web站點(diǎn)的域名信息。

    (3)  Path:設(shè)置Cookies的web頁或目錄的路徑。如果想要從任何頁面或目錄獲取Cookies信息,此變量設(shè)為空值。

    (4)  Secure:如果該字段設(shè)置為"secure",那么Cookies將只能被安全服務(wù)器獲取,如果該字段為空,則沒有該限制。

    (5)  Name=Value:Cookies以鍵-值對的形式設(shè)置或獲取。

      1. 設(shè)置Cookies

       發(fā)送Cookies信息至瀏覽器是非常容易的,這些Cookies將會附加在在HTTP報(bào)文頭的Content-type域前。假設(shè)你想要以Cookies的方式設(shè)置UserID和Password,那么簡單的CGI設(shè)置腳本如下:

      

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. int main ()  
  5. {  
  6.    
  7.    cout << "Set-Cookie:UserID=XYZ;\r\n";  
  8.    cout << "Set-Cookie:Password=XYZ123;\r\n";  
  9.    cout << "Set-Cookie:Domain=www.tutorialspoint.com;\r\n";  
  10.    cout << "Set-Cookie:Path=/perl;\n";  
  11.    cout << "Content-type:text/html\r\n\r\n";  
  12.   
  13.    cout << "<html>\n";  
  14.    cout << "<head>\n";  
  15.    cout << "<title>Cookies in CGI</title>\n";  
  16.    cout << "</head>\n";  
  17.    cout << "<body>\n";  
  18.   
  19.    cout << "Setting cookies" << endl;    
  20.     
  21.    cout << "<br/>\n";  
  22.    cout << "</body>\n";  
  23.    cout << "</html>\n";  
  24.      
  25.    return 0;  
  26. }  


        從這個(gè)例子中你將了解怎么設(shè)置Cookies,那就是使用Set-Cookie來設(shè)置Cookies。

        設(shè)置Cookies屬性的時(shí)候,Expires, Domain, and Path是可選的,值得注意的一點(diǎn)是Cookies的設(shè)置是在發(fā)送"Content-type:text/html\r\n\r\n”之前。運(yùn)行/cgi-bin/setcookies.cgi將會在你的電腦上設(shè)置Cookies。

2.獲取Cookies

      獲取Cookies也非常簡單,Cookies都存儲在CGI的環(huán)境變量HTTP_COOKIE中,并且具有如下的格式:

      key1=value1;key2=value2;key3=value3....

     以下就是一段獲取Cookies的簡短的CGI代碼:

  1. #include <iostream>  
  2. #include <vector>    
  3. #include <string>    
  4. #include <stdio.h>    
  5. #include <stdlib.h>   
  6.       
  7. #include <cgicc/CgiDefs.h>   
  8. #include <cgicc/Cgicc.h>   
  9. #include <cgicc/HTTPHTMLHeader.h>   
  10. #include <cgicc/HTMLClasses.h>  
  11.   
  12. using namespace std;  
  13. using namespace cgicc;  
  14.   
  15. int main ()  
  16. {  
  17.    Cgicc cgi;  
  18.    const_cookie_iterator cci;  
  19.   
  20.    cout << "Content-type:text/html\r\n\r\n";  
  21.    cout << "<html>\n";  
  22.    cout << "<head>\n";  
  23.    cout << "<title>Cookies in CGI</title>\n";  
  24.    cout << "</head>\n";  
  25.    cout << "<body>\n";  
  26.    cout << "<table border = \"0\" cellspacing = \"2\">";  
  27.      
  28.    // get environment variables  
  29.    const CgiEnvironment& env = cgi.getEnvironment();  
  30.   
  31.    for( cci = env.getCookieList().begin();  
  32.         cci != env.getCookieList().end();   
  33.         ++cci )  
  34.    {  
  35.       cout << "<tr><td>" << cci->getName() << "</td><td>";  
  36.       cout << cci->getValue();                                   
  37.       cout << "</td></tr>\n";  
  38.    }  
  39.    cout << "</table><\n";  
  40.     
  41.    cout << "<br/>\n";  
  42.    cout << "</body>\n";  
  43.    cout << "</html>\n";  
  44.      
  45.    return 0;  
  46. }  

點(diǎn)擊/cgi-bin/getcookies.cgi看看效果,將會顯示出之前設(shè)置過的Cookies。

 譯自:http://www.tutorialspoint.com/cplusplus/cpp_web_programming.htm (部分略去未譯)。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C++ Web 編程
一步步領(lǐng)悟 CGI FastCGI PHP
boa 流程分析
歷史學(xué)習(xí)網(wǎng)站推薦
Domino_web開發(fā)與管理
Nginx + CGI/FastCGI + C/Cpp
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服