來源: 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主機方式,服務器只解析對服務域名的請求。當服務器的用途改變時,你也可以隨時改變配置的類型。
|