`
lovnet
  • 浏览: 6878164 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

谈谈在WebServer中如何实现CGI技术

阅读更多
谈谈WebServer中如何实现CGI技术
在WebServer中,cgi技术的实现相信许多人很感兴趣,不过在一些开源软件如Apache中,由于软件规模大,相关模块多,直接去读懂是如何实现的比较费劲,下面就来谈谈CGI技术的实现方法。
要实现CGI技术,关键是要实现执行其他应用程序时,将应用程序的输出从屏幕重定向到SOCKET中去,实现了应用程序的输出重定向后,CGI实现就很简单了。
下面以windows平台为例来实现cgi技术。以下的cgi_writeclient()函数便实现了将CGI程序的输出结果重定向到socket的功能。
HANDLE cgi_exec( HANDLE hPipeWrite, char *exefile, char *cmdline, char *lpszCurrentPath )
{
BOOL bSucceed;
STARTUPINFO sui;
PROCESS_INFORMATION pi;
BOOL bTest;
memset(&sui,0,sizeof(STARTUPINFO));
sui.cb=sizeof(STARTUPINFO);
sui.dwXSize = 0;
sui.dwXSize = 0;
sui.wShowWindow = SW_HIDE;
sui.dwFlags= STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
sui.hStdInput=NULL;
sui.hStdOutput=hPipeWrite;
sui.hStdError=hPipeWrite;
bSucceed = CreateProcess(exefile,
cmdline,
NULL,
NULL,
TRUE,
0,//CREATE_NEW_PROCESS_GROUP ,
NULL,
lpszCurrentPath,//lpszPath,//"\\Rose\\c\\",//NULL,//"d:\ip_progs\namepipe\child",
&sui,
&pi);
if ( bSucceed )
{
CloseHandle( pi.hThread );
return pi.hProcess;
}
// ShowErrorMessage( "CreateProcess()" );
return FALSE;
}
intcgi_writeclient( HTTPRequest *hr )
{
char *pszPath;
HANDLE hProcess;
BOOL bProcessDead = FALSE;
HANDLE hPipeRead, hPipeWrite;
SECURITY_ATTRIBUTES SecAttrib;
int ret;
int BytesInPipe;
char *buf;
DWORD dwRead;
SecAttrib.nLength = sizeof(SECURITY_ATTRIBUTES);
SecAttrib.lpSecurityDescriptor = NULL;
SecAttrib.bInheritHandle = TRUE;
if ( hr->http_mod != HTTP_GET )
{
return MODULE_RUN_CONTINUE;
}
if ( hr->mod != MOD_LOCAL )
{
return MODULE_RUN_CONTINUE;
}
pszPath = MemAlloc( hr->hMem, strlen( pszCgiRoot ) + strlen(hr->http_url) + 10 );
if ( !pszPath )
{
return MODULE_RUN_CONTINUE;
}
/* decide if it is the cgi path */
strcpy( pszPath, hr->http_url );
if ( pszPath[strlen(pszPath)-1] == '/' )
{
if ( *(hr->http_url) == '/' )
{
strcat( pszPath, hr->http_url+1 );
}
else
{
strcat( pszPath, hr->http_url );
}
}
else
{
strcpy( pszPath, pszRoot );
strcat( pszPath, hr->http_url );
ReplaceChar( pszPath, '\\', '/' );
}
if ( strnicmp( pszPath, pszCgiRoot, strlen(pszCgiRoot) ) != 0 )
{
return MODULE_RUN_CONTINUE;
}
ret = CreatePipe( &hPipeRead, &hPipeWrite, &SecAttrib, 65536 );
buf = MemAlloc( hr->hMem, 1024 );
hProcess = cgi_exec( hPipeWrite, NULL, pszPath, NULL );
while ( !bProcessDead )
{
int dwRet;
dwRet = WaitForSingleObject( hProcess, 1 );
if ( dwRet != WAIT_TIMEOUT )
{
bProcessDead = TRUE;
}
if (!PeekNamedPipe(hPipeRead, NULL, 0, NULL, &BytesInPipe, NULL))
{
break;
}
if ( BytesInPipe != 0 )
{
memset( buf, 0, sizeof(buf) );
dwRead = 0;
if ( ReadFile( hPipeRead, buf, 1024, &dwRead, NULL ) )
{
if ( dwRead > 0 )
{
send( hr->s, buf, dwRead, 0 );
}
}
}
}
do
{
if (!PeekNamedPipe(hPipeRead, NULL, 0, NULL, &BytesInPipe, NULL))
{
break;
}
if ( BytesInPipe != 0 )
{
memset( buf, 0, sizeof(buf) );
dwRead = 0;
if ( ReadFile( hPipeRead, buf, 1024, &dwRead, NULL ) )
{
if ( dwRead > 0 )
{
send( hr->s, buf, dwRead, 0 );
}
}
}
} while ( BytesInPipe != 0);
MemFree( hr->hMem, buf );
CloseHandle( hProcess );
CloseHandle( hPipeRead );
CloseHandle( hPipeWrite );
return MODULE_RUN_ENDSESSION;
}
在以上代码中,cgi_exec是实现创建进程,并将进程的输出定向到管道中,然后在cgi_writeclient()函数中,先创建管道,然后调用cgi_exec()函数创建cgi进程并将其输出定向到刚创建的管道中, 然后调用WaitForSingleObject()函数来等待CGI进程运行,注意不是等到进程结束后才从管道读数据。
在cgi进程的运行过程中,每等一段时间,就从管道中读取一部分数据,调用send()函数发送到socket中去。当等到cgi进程结束后,再从管道中将剩余的数据全部读出发送到socket中去。这样就实现了cgi的功能。
分享到:
评论

相关推荐

    uClinux下WebServer及CGI技术的实现.pdf

    根据提供的文件信息,本文将深入探讨在uClinux环境下如何实现WebServer及CGI技术,并具体讲解其实现原理、过程以及应用场景。 ### uClinux环境下的WebServer与CGI技术实现 #### WebServer基本原理与功能 Web...

    嵌入式系统中移植WEB server--BOA。带CGI编写样例

    嵌入式的系统需要嵌入WEB server来进行设备配置和管理。相对PC或服务器上运行的Apache、IIS、tomcat等web server,嵌入式系统由于ram和flash空间的限制,只能运行一些对资源要求低的web server,譬如BOA和GOAHEAD。 ...

    嵌入式Linux Webserver软件BOA实现与应用.pdf

    嵌入式Linux Webserver软件BOA实现与应用是指在嵌入式系统中实现Web服务器软件BOA的开发和应用。本文介绍了在Motorola公司生产的嵌入式CPU MPC823e平台上成功移植了Linux和BOA webserver,并实现了在串口与嵌入式...

    vxWorks中的web Server.pdf

    本文将详细介绍在嵌入式操作系统vxWorks中设计与实现Web Server的方法,并探讨两种实现方案:使用Wind Web Server组件和移植免费的GoAhead Web Server。 #### 二、嵌入式Web Server的重要性 嵌入式Web Server能够...

    android webserver简单网页服务器

    在Android系统中,创建WebServer需要获取相应的权限。在AndroidManifest.xml文件中,需要添加`INTERNET`权限,允许应用访问网络,可能还需要`WRITE_EXTERNAL_STORAGE`或`READ_EXTERNAL_STORAGE`权限,以便读取或...

    LabVIEW Web Server 设计

    在LabVIEW中,Web Server功能的配置包括以下几个主要步骤: 1. **配置Web Server**: - 启动LabVIEW主程序,编辑并调试好所需的VI面板。 - 通过“工具”->“选项”(O)打开设置,选择\Web服务器\选项卡。 - ...

    C++实现高并发webserver项目

    在本项目"C++实现高并发webserver项目"中,我们将探讨如何使用C++构建一个能够处理高并发请求的Web服务器。这个服务器不仅包含了基础的HTTP服务功能,还涉及到了线程池、数据库连接池以及状态机转换等高级技术,使得...

    搭建Web服务的嵌入式Web Server

    - 传统上,嵌入式Web Server是直接运行在嵌入式设备内部的,目的是为了发送简单的网页和处理CGI等基本网络请求。 - 随着Web技术的发展,传统的嵌入式Web Server已不能满足更多高级功能的需求,比如表单更新、实时...

    STM32+LWIP+WEB_SSI_CGI

    在STM32项目中,通过WEB_SSI_CGI,开发者可以编写C语言的CGI程序,这些程序在STM32上运行,并通过LWIP发送到客户端,从而实现网页的动态更新和实时数据展示。 **网络编程流程** 1. **初始化**:首先,需要配置STM32...

    oracle webserver完全教程

    在使用Oracle WebServer部署应用程序时,通常会涉及到CGI(通用网关接口)和Servlet。CGI是一种标准,使得Web服务器能够调用外部程序处理请求,而Servlet是Java平台上的Web应用编程接口,可以生成动态内容。了解如何...

    CGI在嵌入式WEB服务器中的应用和实现.pdf

    综上所述,文章详细探讨了在嵌入式Linux系统中应用CGI技术来构建Web服务器的方案,包括了CGI的实现原理、Web服务器的配置、CGI脚本的编写、客户端与服务器之间的数据交互机制,以及相关的硬件支持和软件配置。...

    基于Matlab Web Server的远程控制实验室仿真模块实现

    Matlab Web Server及其在网络应用中的应用 ##### 2.1 Matlab Web Server简介 Matlab Web Server是由MathWorks公司推出的一款工具箱,它能够为远程用户提供Matlab的计算服务。通过Matlab Web Server,可以轻松实现...

    stm32f107 web server

    STM32F107 Web服务器是一个嵌入式系统项目,它允许用户通过网页界面与基于STM32...通过这个项目,开发者可以学习到如何在资源受限的嵌入式环境中实现网络通信和Web服务,这对于物联网(IoT)和工业4.0应用非常有价值。

    Webserver.rar_cgi web_webserver_web页面 监控_嵌入式 webserver_监控 设备 管理

    随着Internet技术的兴起,在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的B/S结构,即在 嵌入式设备上运行一个支持脚本或CGI功能的Web服务器,能够生成动态页面,...

    Openfire下实现WebServer

    在实现WebServer的过程中,我们需要关注以下技术点: - **JSP与Servlet**:Web应用通常由JSP和Servlet组成,它们分别用于视图展示和业务逻辑处理。 - **MVC架构**:采用Model-View-Controller模式设计Web应用,有助...

    Oracle WebServer完全教程

    本书首先会引导读者了解Oracle WebServer的基础概念,包括Web服务器的工作原理、Oracle WebServer的主要组件以及其在企业级应用中的角色。这将帮助初学者建立起对Web服务器和Oracle WebServer的基本认识。 接着,书...

    基于Hi3510处理器和Linux的嵌入式WebServer的研究和实现

    本文将详细介绍如何在基于嵌入式Linux操作系统和海思Hi3510处理器的系统中实现Web Server,并探讨其应用前景。 #### 二、嵌入式WebServer概述 ##### 2.1 嵌入式WebServer的概念 嵌入式WebServer是一种专门针对...

    WebServer实现.zip

    用eclipse实现Webserver,支持多个User agent,同时用户可以自己设定Web服务器端的socket端口号。编程相关书籍推荐:基于java的综合课程设计(清华大学出版社)和java语言编程设计

    CGI实现登录、注册功能

    CGI(Common Gateway Interface,通用网关接口)是一种在Web服务器和服务器端程序之间通信的标准协议,它允许Web服务器调用非HTTP协议处理程序来处理请求。在这个特定的上下文中,"CGI实现登录、注册功能"指的是使用...

    C#编写的调用VS自带WebDev.WebServer40.EXE程序源代码

    WebDev.WebServer40.EXE是Visual Studio 2010及其早期版本中用于本地Web应用开发的一个小型内置服务器,它允许开发者在没有完整IIS(Internet Information Services)的情况下进行调试和测试。 描述中提到,通过`...

Global site tag (gtag.js) - Google Analytics