CGI 簡介
CGI(Common Gateway Interface: 公用網關接口) 規定了Web服務器調用其他可執行程序(CGI程序)的接口協議標准。Web服務器通過調用CGI程序實現和Web瀏覽器的交互,也就是CGI程序接受Web瀏覽器發送給Web服務器的信息,進行處理,將響應結果再回送給Web服務器及Web瀏覽器。CGI程序一般完成Web網頁中表單(Form)數據的處理、數據庫查詢和實現與傳統應用系統的集成等工作。CGI程序可以用任何程序設計語言編寫,如Shell腳本語言、Perl、Fortran、Pascal、C語言等。但是用C語言編寫的CGI程序具有執行速度快、安全性高(因為C語言程序是編譯執行且不可被修改)等特點。
簡單來說,Cgi之於Perl等這些腳本語言,就如ECMAScript於javascript,前者同樣是一套標准(接口)
cgi原理
CGI接口標准包括標准輸入、環境變量、標准輸出三部分:
stdlib.h庫中定義的用於Cgi編程的環境變量列表:
無論是用Perl還是C語言寫cgi程序,實際上都是調用標准庫內置的一系列api。
案例
<!-- 客戶端 -->
<!-- cgi_test.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<title>cgi_test</title>
</head>
<body>
<center>
<!-- 注意表單的 action值 -->
<form id="form" name="form" method="get" action="http://localhost:12308/cgi-bin/test/cgi_test.cgi">
<p>姓名:<input type="text" name="user" /></p>
<p><input type="submit" name="submit" value="提交" placeholder="請輸入: " style="width: 120px;position: relative;left: 20px;" /></p>
</form>
</center>
</body>
</html>
// 服務器端
/* cgi_test.cgi */
/* 將以下C代碼編譯成.cgi二進制文件后即可使用 */
// 以下代碼可以得到上述表單通過get方法傳給服務器的信息
/*
get方式提交,意思就是把提交的內容放在地址后面,用?隔開
post提交就是把數據放在數據包里發送給目標地址
*/
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "iostream"
#include "string"
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { // Html頭信息,它告訴Web服務器隨后的html代碼輸出是以純ASCII文本的形式
int i, n = 0;
string Str = "";
printf("Content-type:text/html\n");
printf("<h1>get and post< !/h1>\n");
if(getenv("CONTENT-LENGTH")) { // 檢查環境變量CONTENT-LENGTH是否為空(Web服務器並不以文件結束符來終止它的輸出,所以如果不檢查環境變量CONTENT-LENGTH, CGI程序就無法知道什么時候輸入結束了)
n=atoi(getenv("CONTENT-LENGTH")); // 使用atoi()將CONTENT-LENGTH轉換為整數,內容的長度
Str = getenv("QUERY_STRING");
}
printf("%s\n", Str); // 打印get方法獲取的信息
fflush(stdout);
return 0;
}
// .cgi文件一般放在Apache服務器的cgi-bin目錄即可使用