CGI是Common Gateway Interface的缩写,翻译成中文就是通用网关接口,它是网页的后台处理程序,运行在服务器端上,可以用多种语言书写,最常用的就是Perl(因为Perl有强大的字符串处理功能,而CGI程序经常要处理许多的字符串)。举个例子来说,通常一般的论坛或邮箱等都需要注册,需要用户输入用户名和密码,首先给你一个静态的页面,上面有两个文本框,要求你输入用户名和密码,还有一个提交和重置的按钮,用于提交用户的输入,当用户点击提交按钮时,这个请求就被发送到服务器端,服务器上的CGI程序就会解析用户的输入,并且验证用户的输入是否合法,是否被通过验证等。下面看一个非常简单的例子,代码是最好的解说:
<html>
<head><title>用户登陆验证</title></head>
<body>
<form name="form1" action="/cgi-bin/output.cgi" method="POST">
<table align="center">
<tr><td align="center" colspan="2"></td></tr>
<tr>
<td align="right">用户名</td>
<td><input type="text" name="Username"></td>
</tr>
<tr>
<td align="right">密 码</td>
<td><input type="password" name="Password"></td>
</tr>
<tr>
<td><input type="submit" value="登 录"></td>
<td><input type="reset" value="取 消"></td>
</tr>
</table>
</form>
</body>
</html>
-------------------------以下是cgi处理程序的源码----------------------------
/* output.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* getcgidata(FILE* fp, char* requestmethod);
int main()
{
char *input;
char *req_method;
char name[64];
char pass[64];
int i = 0;
int j = 0;
// printf("Content-type: text/plain; charset=iso-8859-1\n\n");
printf("Content-type: text/html\n\n");
printf("The following is query reuslt:<br><br>");
req_method = getenv("REQUEST_METHOD");
input = getcgidata(stdin, req_method);
// 我们获取的input字符串可能像如下的形式
// Username="admin"&Password="aaaaa"
// 其中"Username="和"&Password="都是固定的
// 而"admin"和"aaaaa"都是变化的,也是我们要获取的
// 前面9个字符是UserName=
// 在"UserName="和"&"之间的是我们要取出来的用户名
for ( i = 9; i < (int)strlen(input); i++ )
{
if ( input[i] == '&' )
{
name[j] = '\0';
break;
}
name[j++] = input[i];
}
// 前面9个字符 + "&Password="10个字符 + Username的字符数
// 是我们不要的,故省略掉,不拷贝
for ( i = 19 + strlen(name), j = 0; i < (int)strlen(input); i++ )
{
pass[j++] = input[i];
}
pass[j] = '\0';
printf("Your Username is %s<br>Your Password is %s<br> \n", name, pass);
return 0;
}
char* getcgidata(FILE* fp, char* requestmethod)
{
char* input;
int len;
int size = 1024;
int i = 0;
if (!strcmp(requestmethod, "GET"))
{
input = getenv("QUERY_STRING");
return input;
}
else if (!strcmp(requestmethod, "POST"))
{
len = atoi(getenv("CONTENT_LENGTH"));
input = (char*)malloc(sizeof(char)*(size + 1));
if (len == 0)
{
input[0] = '\0';
return input;
}
while(1)
{
input[i] = (char)fgetc(fp);
if (i == size)
{
input[i+1] = '\0';
return input;
}
--len;
if (feof(fp) || (!(len)))
{
i++;
input[i] = '\0';
return input;
}
i++;
}
}
return NULL;
}
上面的第一个是一个静态html页面,要求用户输入用户名和密码,当户输入之后,点击“登录”按钮,则用户的输入就被提交到服务器,由output.cgi来处理,在这里,只是作为一个演示,output.cgi把用户的输入显示在页面上。
操作提示:将第一段HTML代码拷贝到一个文本文件,另存为login.htm,注意扩展名要用htm或者html,第二段代码是c语言源代码,笔者在VC++6.0下编译通过,生成文件为output.exe,将其改名为output.cgi,login.htm放在网站的目录,output.cgi放在网站的cgi-bin目录。笔者用的是Apache服务器,将login.htm放在了htdocs下面,将output.cgi放在了cgi-bin目录。在浏览器输入
http://127.0.0.1/login.htm
就会出现
这样页面,当用户输入了用户名和密码之后,点击“登录”按钮,就会出现下面的页面
The following is query reuslt:
Your Username is admin
Your Password is admin888
这里我们假设在用户名文本框里输入的是"admin",在密码框里输入的是"admin888"。
需要说明是要在本机上运行该cgi程序,需要装支持cgi的Web服务器,最常见的免费Web服务器就是apache,这个很容易下载到。安装之后,基本不需要做任何的配置,把login.htm放在htdocs目录下面,把output.cgi放在cgi-bin目录下,启动web服务器后,就可以解释cgi程序了。
笔者也刚接触,写的很粗糙,如有不适之处,望广大网友批评指正。
http://blogold.chinaunix.net/u/5391/showart_265981.html
分享到:
相关推荐
这个项目是学习CGI编程和C语言结合的理想实例,因为它提供了对用户管理、发布主题和回帖功能的基本实现。 【CGI简介】: CGI是一种标准,允许Web服务器与外部程序交互,以动态生成网页内容。这种交互使得服务器能够...
下面是一个简单的C语言CGI程序示例,它接收并输出HTML表单的数据: ```c #include #include int main() { int i, n; printf("Content-type:text/plain\n\n"); n = 0; if (getenv("CONTENT_LENGTH")) { n =...
C语言CGI程序的核心部分通常包括以下步骤: 1. **环境变量解析**:CGI程序首先需要获取来自HTTP请求的环境变量,如QUERY_STRING(GET方法传递的参数)、REQUEST_METHOD(GET或POST请求类型)和CONTENT_TYPE(POST...
文章通过实例演示了如何在ARM平台上使用C语言CGI实现远程控制。ARM平台由于其高性能和低能耗的特点,被广泛应用于嵌入式设备中。在这个实例中,可能涉及的操作包括读取传感器数据、控制GPIO(通用输入输出)引脚状态...
C语言 CGI实例 http://blog.csdn.net/ajrm0925/article/details/8810342 http://blog.csdn.net/liang890319/article/details/6277900 http://blog.csdn.net/gnefniu/article/details/42432657 上传文件: ...
这个实例是用C语言实现的HTTP服务器,名为tinyhttpd,它支持CGI功能。让我们深入探讨CGI和如何在C语言中实现HTTP服务器。 **CGI的基本原理:** CGI为Web服务器提供了一个接口,当用户请求动态内容时,服务器会启动...
总体而言,《CGI编程指南》一书通过理论与实例相结合的方式,系统地讲解了CGI编程的各个方面,旨在帮助读者掌握CGI编程的基础知识,并能够将这些知识应用到实际的项目中。书中内容从CGI的基本概念到具体的编程技术,...
在本资源"cgi_test.tar.gz"中,包含了一个基于C语言编写的CGI程序实例,这对于理解和开发CGI应用程序非常有帮助。这个压缩包特别针对Linux和Unix环境,同时考虑到了在Web服务器上的应用,尤其是对于嵌入式系统如ARM...
在这个例子中,我们看到有“gpio_test.c”和“gpio_cgi.c”,它们可能是用C语言编写的CGI程序,用于处理GPIO(General Purpose Input/Output)相关的请求。GPIO是微控制器上常见的接口,用于控制硬件引脚的输入和...
#### 示例:C语言CGI程序实例 以下是一个使用C语言编写的简单CGI程序示例,用于处理乘法运算的HTML表单: ```c #include #include int main(void) { char *data; long m, n; // 输出HTTP头信息 printf(...
CGI(Common Gateway Interface,通用...这个源码可以作为一个学习实例,通过阅读和调试,可以深入了解CGI和SQLite3的交互细节。同时,它也可以作为一个基础,进一步扩展成更复杂的功能,例如用户认证、事务处理等。
在这个压缩包中,可能包含的是用C语言编写的CGI源程序,用于处理来自Web端的请求,比如获取摄像头数据、控制LED状态或者修改开发板时间。 **Web端功能实现:** 1. **查看摄像头图片**:这通常涉及到Web服务器接收...
在这个“cgi.rar”压缩包中,包含了一个关于CGI编程的实例,特别是关于在Linux环境下的CGI应用以及CGI处理POST和GET请求的方法。这个例子对于学习如何在不同的操作系统,如Windows,使用CGI技术非常有帮助。 首先,...
CGI(Common Gateway Interface,通用网关接口)是Web服务器与外部程序进行通信的一种标准协议,使得动态网页的生成成为...同时,这个乘法计算器的实例提供了一个实践CGI编程的简单案例,有助于加深对CGI原理的理解。
C语言中的数据输入与输出是程序的基本操作,主要包括使用`scanf()`和`printf()`这两个标准库函数。`scanf()`用于从输入源读取数据,如键盘、文件或网络,而`printf()`则负责将处理后的数据输出到目标,如显示器、...
总的来说,这个压缩包提供了一个实践CGIC库的实例,对于想要学习或改进CGI编程技能的开发者来说,这是一个宝贵的学习资源。它涵盖了CGIC库的使用,HTTP协议的理解,以及C语言编写CGI程序的技巧。通过研究这个示例,...
【WebServer-cgi】是一个关于Web服务器与CGI(Common Gateway Interface)交互的实例项目,旨在帮助开发者理解和实践Web服务器如何处理动态内容。CGI是一种标准,允许Web服务器执行外部程序(如脚本或应用程序),并...
实例113讲解了用C语言进行CGI(Common Gateway Interface)程序设计。CGI是Web服务器与外部程序交互的标准,使得动态网页生成成为可能。C++程序员了解CGI的基本原理和实践,可以为Web应用开发打下基础。 实例104是...
总的来说,"cgictest.rar_cgi compiler_cgic" 提供了一个使用CGIC库的自编译CGI程序,它支持执行SHELL命令,可以作为学习CGI编程和了解CGIC库使用的一个实例。在实际部署时,必须注意安全问题,避免潜在的命令注入...
"c_menu_routine.rar"压缩包包含的资源正是关于这一主题的,提供了C语言中实现菜单功能的实例。下面将详细讨论C语言中创建菜单的方法及其相关知识点。 首先,菜单通常由一系列选项组成,这些选项被组织成结构化的...