WEB SERVER如何支持CGI/PHP/Perl ___ 程序的核心内容(1)
2008-05-01 03:14
363 查看
来源: 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主机方式,服务器只解析对服务域名的请求。当服务器的用途改变时,你也可以随时改变配置的类型。
正文:
自己写一个函数来支持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主机方式,服务器只解析对服务域名的请求。当服务器的用途改变时,你也可以随时改变配置的类型。
相关文章推荐
- WEB SERVER如何支持CGI/PHP/Perl ___ 程序的核心内容(2)
- 如何让iis支持PHP+MYSQL,CGI,PERL和ASP
- 《Apache服务之php/perl/cgi语言的支持》RHEL6——服务的优先级
- Win2003下配置iis+php+mysql+zend图文 使其支持asp,.net,cgi,perl和php
- Win7系统下如何配置Tomcat支持PHP和Perl
- ubuntu系统如何让php支持GD
- 如何对PHP程序中的常见漏洞进行攻击(上)
- js和php如何获取当前url的内容
- 如何在win7上调试perl程序
- IIS7 and IIS7.5 下如何支持php的多版本
- 使用Perl编写CGI程序(前后端)
- 如何在PHP扩展里打开php openssl支持
- window下如何让php支持openssl
- 在安装PHP论坛时提示 您的服务器不支持MySql数据库,无法安装论坛程序
- 如何用PHP来操作XML的内容
- php支持mod及php-cgi的方式
- php如何分割字符串?php mb_substr分割字条串,解决中文乱码问题,支持分割中文!
- apache php如何让cgi模式和dso模式共存
- AB程序核心代码(MFC从文件读取一行+MFC字符串处理+C在文件末尾追加内容)
- 一个对文本内容进行排序的小程序的核心代码 推荐