C++ Web 編程(菜鳥教程)
C++ Web 編程
什么是 CGI?
- 公共網關接口(CGI),是一套標准,定義了信息是如何在 Web 服務器和客戶端腳本之間進行交換的。
- CGI 規范目前是由 NCSA 維護的,NCSA 定義 CGI 如下:
- 公共網關接口(CGI),是一種用於外部網關程序與信息服務器(如 HTTP 服務器)對接的接口標准。
- 目前的版本是 CGI/1.1,CGI/1.2 版本正在推進中。
Web 瀏覽
為了更好地了解 CGI 的概念,讓我們點擊一個超鏈接,瀏覽一個特定的網頁或 URL,看看會發生什么。
- 您的瀏覽器聯系上 HTTP Web 服務器,並請求 URL,即文件名。
- Web 服務器將解析 URL,並查找文件名。如果找到請求的文件,Web 服務器會把文件發送回瀏覽器,否則發送一條錯誤消息,表明您請求了一個錯誤的文件。
- Web 瀏覽器從 Web 服務器獲取響應,並根據接收到的響應來顯示文件或錯誤消息。
然而,以這種方式搭建起來的 HTTP 服務器,不管何時請求目錄中的某個文件,HTTP 服務器發送回來的不是該文件,而是以程序形式執行,並把執行產生的輸出發送回瀏覽器顯示出來。
公共網關接口(CGI),是使得應用程序(稱為 CGI 程序或 CGI 腳本)能夠與 Web 服務器以及客戶端進行交互的標准協議。這些 CGI 程序可以用 Python、PERL、Shell、C 或 C++ 等進行編寫。
CGI 架構圖
下圖演示了 CGI 的架構:

Web 服務器配置
在您進行 CGI 編程之前,請確保您的 Web 服務器支持 CGI,並已配置成可以處理 CGI 程序。所有由 HTTP 服務器執行的 CGI 程序,都必須在預配置的目錄中。該目錄稱為 CGI 目錄,按照慣例命名為 /var/www/cgi-bin。雖然 CGI 文件是 C++ 可執行文件,但是按照慣例它的擴展名是 .cgi。
默認情況下,Apache Web 服務器會配置在 /var/www/cgi-bin 中運行 CGI 程序。如果您想指定其他目錄來運行 CGI 腳本,您可以在 httpd.conf 文件中修改以下部分:
<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/var/www/cgi-bin"> Options All </Directory>
在這里,我們假設已經配置好 Web 服務器並能成功運行,你可以運行任意的 CGI 程序,比如 Perl 或 Shell 等。
第一個 CGI 程序
請看下面的 C++ 程序:
實例
編譯上面的代碼,把可執行文件命名為 cplusplus.cgi,並把這個文件保存在 /var/www/cgi-bin 目錄中。在運行 CGI 程序之前,請使用 chmod 755 cplusplus.cgi UNIX 命令來修改文件模式,確保文件可執行。訪問可執行文件,您會看到下面的輸出:
Hello World! 這是我的第一個 CGI 程序
上面的 C++ 程序是一個簡單的程序,把它的輸出寫在 STDOUT 文件上,即顯示在屏幕上。在這里,值得注意一點,第一行輸出 Content-type:text/html\r\n\r\n。這一行發送回瀏覽器,並指定要顯示在瀏覽器窗口上的內容類型。您必須理解 CGI 的基本概念,這樣才能進一步使用 Python 編寫更多復雜的 CGI 程序。C++ CGI 程序可以與任何其他外部的系統(如 RDBMS)進行交互。
HTTP 頭信息
行 Content-type:text/html\r\n\r\n 是 HTTP 頭信息的組成部分,它被發送到瀏覽器,以便更好地理解頁面內容。HTTP 頭信息的形式如下:
HTTP 字段名稱: 字段內容 例如 Content-type: text/html\r\n\r\n
還有一些其他的重要的 HTTP 頭信息,這些在您的 CGI 編程中都會經常被用到。
| 頭信息 | 描述 |
|---|---|
| Content-type: | MIME 字符串,定義返回的文件格式。例如 Content-type:text/html。 |
| Expires: Date | 信息變成無效的日期。瀏覽器使用它來判斷一個頁面何時需要刷新。一個有效的日期字符串的格式應為 01 Jan 1998 12:00:00 GMT。 |
| Location: URL | 這個 URL 是指應該返回的 URL,而不是請求的 URL。你可以使用它來重定向一個請求到任意的文件。 |
| Last-modified: Date | 資源的最后修改日期。 |
| Content-length: N | 要返回的數據的長度,以字節為單位。瀏覽器使用這個值來表示一個文件的預計下載時間。 |
| Set-Cookie: String | 通過 string 設置 cookie。 |
CGI 環境變量
所有的 CGI 程序都可以訪問下列的環境變量。這些變量在編寫 CGI 程序時扮演了非常重要的角色。
| 變量名 | 描述 |
|---|---|
| CONTENT_TYPE | 內容的數據類型。當客戶端向服務器發送附加內容時使用。例如,文件上傳等功能。 |
| CONTENT_LENGTH | 查詢的信息長度。只對 POST 請求可用。 |
| HTTP_COOKIE | 以鍵 & 值對的形式返回設置的 cookies。 |
| HTTP_USER_AGENT | 用戶代理請求標頭字段,遞交用戶發起請求的有關信息,包含了瀏覽器的名稱、版本和其他平台性的附加信息。 |
| PATH_INFO | CGI 腳本的路徑。 |
| QUERY_STRING | 通過 GET 方法發送請求時的 URL 編碼信息,包含 URL 中問號后面的參數。 |
| REMOTE_ADDR | 發出請求的遠程主機的 IP 地址。這在日志記錄和認證時是非常有用的。 |
| REMOTE_HOST | 發出請求的主機的完全限定名稱。如果此信息不可用,則可以用 REMOTE_ADDR 來獲取 IP 地址。 |
| REQUEST_METHOD | 用於發出請求的方法。最常見的方法是 GET 和 POST。 |
| SCRIPT_FILENAME | CGI 腳本的完整路徑。 |
| SCRIPT_NAME | CGI 腳本的名稱。 |
| SERVER_NAME | 服務器的主機名或 IP 地址。 |
| SERVER_SOFTWARE | 服務器上運行的軟件的名稱和版本。 |
下面的 CGI 程序列出了所有的 CGI 變量。
