WEB SERVER如何支援CGI/PHP/Perl
最後更新:2017-02-28
來源:互聯網
上載者:User
cgi|perl|server|web|程式 來源: zerodj 發布
本文:
自己寫一個函數來支援CGI運行...
思路:
當WEB SERVER的請求是一個執行檔案,
那麼就執行這個檔案(利用進程),可是如果要傳入資料給CGI該如何辦,那麼CGI運行後的結果,在自己的程式中該如何得到呀?
那麼就可以是管道,來達到資料的共用!
WEB頁提交的資料在自己的程式中是可以得到的(SOCKET來得到)!就把資料傳入給管道!
CGI程式需要的資料就從管道中去讀!
當CGI程式運行結束後,就將結果輸出給管道,自己的程式去讀管道中的內容!
然後用SOCKET將結果發送給IE/NS就可以了!
下面只是一個函數,
cgiFileName:要執行的CGI程式名稱
pPostValue:WEB頁提交的值(POST方法提交的)
pPipeValue:環境變數的值(GET方法提交的值是放在環境變數QUERY_STRING中的)
isStdRead:CGI程式是否需要從管道中讀取值
注意:POST方法提交的值,在環境變數中有一個變數CONTENT_LENGTH是記錄POST提交值的長度!
每個環境變數是用''\0''字元來隔開的!(QUERY_STRING=name=66&password=77\0CONTENT_LENGTH=0\0\0)
當環境變數結尾應使用\0\0來結束!
千萬不用API:SetEnvironmentVariable()來設定環境變數,一但將POST的值寫入管道傳給CGI程式,那用這個API函數設定的環境變數會丟失.
AnsiString CgiScriptRun(AnsiString cgiFileName,AnsiString pPostValue,char *pPipeValue,bool isStdRead){
HANDLE hProcess,hWrite,hRead, //進程控制代碼,管道寫控制代碼,管道讀控制代碼
SECURITY_ATTRIBUTES sa, //安全性結構
STARTUPINFO mysi, //子進程視窗屬性結構
PROCESS_INFORMATION mypi, //子進程資訊
bool bTest, //API是否調用成功
//填充安全性結構使控制代碼被繼承
sa.nLength=sizeof(SECURITY_ATTRIBUTES),
sa.lpSecurityDescriptor=NULL,
sa.bInheritHandle=true,
bTest=CreatePipe(&hRead,&hWrite,&sa,0), //建立管道
if(!bTest){
return "",
}
//填充進程啟動資訊
memset(&mysi,0,sizeof(STARTUPINFO)),
mysi.cb=sizeof(STARTUPINFO),
mysi.dwFlags=STARTF_USESTDHANDLES,
if(!isStdRead)
//如果CGI(或PHP程式)不要從PIPE中取值(用了GET方法),則使用標準輸入
mysi.hStdInput=GetStdHandle(STD_INPUT_HANDLE),
else
//則使用從管道中讀
mysi.hStdInput=hRead,
mysi.hStdOutput=hWrite,//CGI程式運行結束後,會將結果送給標準輸出(螢幕),在這裡告訴CGI讓它把
//結果送出個建立的管道中
mysi.hStdError=hWrite, //CGI程式出錯,將出錯資訊改從管道中輸出,(也就是向管道中寫進資訊)
//建立子進程
bTest=CreateProcess(NULL,
cgiFileName.c_str(),NULL,
NULL,true,//true為讓這個進程繼承上面設定的一些輸入輸出資訊
DETACHED_PROCESS,
(LPVOID)pPipeValue,NULL,&mysi,&mypi),
//(LPVOID)pPipeValue ---傳的環境變數
if(bTest)hProcess=mypi.hProcess,
else return"",
if(isStdRead){
if(bTest){
CloseHandle(mypi.hThread),
DWORD dwWritten,
bool bReturn,
char *g=pPostValue.c_str(),
//將提交的值寫進管道
bReturn=WriteFile(hWrite,g,strlen(g),&dwWritten,NULL),
if(!bReturn)return "",
}
if(!bTest)return "",
//等待CGI程式執行完畢
WaitForSingleObject(hProcess,WAIT_ABANDONED),
}
//一定要關閉管道的讀控制代碼
CloseHandle(hWrite),
char readBuf[100],
DWORD bytesRead=0,
AnsiString cgiout="",
//上面的CGI程式執行完畢後已經將結果寫進管道了,現在只要讀出來就可以了!
while(ReadFile(hRead,readBuf,100,&bytesRead,NULL)){
readBuf[bytesRead]=''\0'',
cgiout=cgiout+AnsiString(readBuf),
}
CloseHandle(hRead),
CloseHandle(hProcess),
//返回執行結果用SOCKET發送個使用者!
return cgiout,
}
CGI程式是從標準輸入中讀資料,輸出給標準輸出!
這裡用了管道,在自己的程式中,建立PIPE,讓CGI改從PIPE中讀資料或從PIPE中輸出運行結果!
如果你的CGI程式中使用了檔案操作!
如:開啟檔案,將文內容輸出!
注意這裡的檔案路徑請使用絕對路徑,如果要用相對路徑的話,它的參考路徑為你這個應用程式所在路徑,而不是CGI的路徑
zerodj@163.com
標題: 在linux上使用BIND建立DNS伺服器 [刪除]
作者: Thomas Nooning 分類: linux 關鍵字: dns
本文:
作者: Thomas Nooning, TechRepublic
日期: 2001年09月19日
儘管Linux在案頭計算的世界中還沒有取得令人信服的進展,但作為網路伺服器它已經小有名氣了。由於其出色的可靠性,我們可以放心地在Linux上運行當今Internet時代所必需的各種重要服務程式。由此,Linux最普遍的一些用途包括用作郵件伺服器、Web伺服器以及DNS伺服器。
下面我們將研究怎樣在Red Hat Linux上使用BIND建立一個DNS伺服器。BIND(Berkeley Internet Name Domain)是一個在UNIX/Linux系統上實現的網域名稱解析服務軟體包。我們將學習在Linux上建立和運行一個DNS伺服器所需的安裝、初始配置以及系統設定等步驟。
下載、安裝、配置<a href=http://www.linuxbyte.net/showsoftd.php?ID=224 class=red target=_blank>BIND</a>
下載和安裝<a href=http://www.linuxbyte.net/showsoftd.php?ID=224 class=red target=_blank>BIND</a>
你可以在www.isc.org/products/BIND/下載BIND的源碼包。最新的版本是9.1.3(寫這篇文章時),同時還可以下載支援資訊和FAQ。
在本文中我們用Red Hat作為樣本,所以你也許希望使用BIND的RPM版本,可以通過搜尋www.rpmfind.net找到它,因為使用RPM形式的發行包是安裝BIND最簡便的方法。下載了BIND的RPM之後,比如bind-9.1.0-10.i386.rpm,需要以超級使用者的身份執行rpm -ivh bind-9.1.0-10.i386.rpm命令。在RPM安裝BIND時要注意檢查任何能夠導致安裝失敗的缺失的依賴關係。
如果你更願意從源碼包安裝的話,在下載如bind-9.1.3.tar.gz這樣的檔案之後需要以超級使用者身份運行tar xvfz bind-9.1.3.tar.gz命令對它進行解壓。就本例而言會產生一個名為bind-9.1.3的目錄,它包含了進行安裝所必需的所有檔案。下一步,進入這個新建立的目錄然後執行./configure命令,在指令碼程式完成所有配置工作後,運行make,接著運行make install完成安裝過程。現在在你的系統中應該已經安裝好了基本配置的BIND,接下來要根據需要對它進行調整。
配置BIND
當系統中安裝好BIND之後,你就可以把它配置成多種方式。最常用的兩種之一是使用ISP類型的設定,DNS伺服器接受並解析來自任何人的請求(或者一組預先定義的使用者);另一種是Web主機方式,伺服器只解析對服務網域名稱的請求。當伺服器的用途改變時,你也可以隨時改變更配置置的類型。