文章目录
自学,手打,希望多多点赞评论支持,让更多需要的人看见!——花前月
一、配置CGI运行环境——Apache下载安装
下载
解压缩
修改配置
修改conf/httpd.conf
修改Apache存放路径为解压路径
修改监听窗口为8086
修改Server Name为127.0.0.1
修改conf/extra/httpd-ahssl.conf和httpd-ssl.conf
将两个文件的443端口改为444(只要端口不被占用就行)
测试配置文件是否合法
httpd -t #测试配置文件是否合法
添加环境变量
启动Apache服务
1、使用管理员身份打开cmd(win+R,输入cmd,按ctrl+shift+enter打开),安装Apache服务
httpd -k install -n Apache2.4 #-n后面表示自定义访问名称
2、启动Apache服务
http -k start
3、查看服务是否启动成功
也可通过此处打开关闭Apache服务
4、测试——在浏览器访问http://127.0.0.1:8086,出现以下页面表示配置成功。
之后我们可以通过修改Apache24\htdocs目录下的index.html文件来更改这个初始页面。
5、停止服务
httpd -k stop #停止
二、测试CGI功能
用VS2022新建一个控制台应用程序工程,在主函数中写入:
cout << "Content-type:text/html\n\n";//告诉浏览器将以html的语法来解析此文件
cout << "Hello world";
先别急着编译,我们先在工程上点右键,选择属性:
在配置设置-常规中,更改输出目录为cgi-bin下
在配置属性-高级中更改目标文件的扩展名成cgi
编译后,我们来到cgi-bin中,就可以看到我们编译生成好的"test.cgi"文件。
启动Apache服务后,在浏览器中输入localhost/cgi-bin/test.cgi就可以看到hello world了
只要通过printf或cout,就可以将任何html代码输出在浏览器里。而且,因为是用C/C++写的程序,所以C/C++下的一切函数,都可以用在CGI程序里。
三、向Apache中添加通信录网页
打开Apache\htdocs,将通讯录网页放置到文件夹中,启动Apache服务后向浏览器中输入127.0.0.1:8086。
通讯录网页详细代码:
<html>
<head>
<meta charset="gb2312">
<!--规定 HTML 文档的字符编码-->
</head>
<body>
<form id ="form" name="form" method="get" action="http://127.0.0.1:8086/cgi-bin/test.cgi" >
<!--表单数据作为 URL 变量(使用 method="get")发送-->
<!--action 属性定义提交表单时要执行的操作——跳转到http://127.0.0.1:8086/cgi-bin/test.cgi-->
<P>姓名
<input type="text" id="name" name="name"/>
<!--文本框-->
</P>
<p>年龄
<select id="age" name="age">
<!--下拉框-->
<option value="18" selected="selected">18</option>
<option value="19" >19</option>
<option value="20" >20</option>
<option value="21" >21</option>
</select>
</p>
<P>性别
<input type="radio" id="men" name="gender" value="男"/>男
<input type="radio" id="women" name="gender" value="女" />女
<!--单选框-->
</P>
<P>手机
<input type="text" id="phonenum" name="phonenum" />
<!--文本框-->
</P>
<p>
<input type="submit" name="submit" value="提交" />
<!--提交按钮 - 单击将尝试提交表单到服务器-->
</p>
</form>
</body>
<script>
//脚本,检测输入是否合法
var f = document.getElementById("form");
var n = document.getElementById("name");
var m = document.getElementById("men");
var w = document.getElementById("women");
var p = document.getElementById("phonenum");
form.onsubmit = function(){
if(n.value==''||n.value==null){
alert('请填写姓名!');
return false;
}
else if(!(m.checked||w.checked)){
alert('请选择性别!');
return false;
}
else if(p.value==''||p.value==null){
alert('请填写手机号');
return false;
}
}
</script>
</html>
测试通讯录网页
点击提交按钮后可在浏览器地址栏中看见URL 变量的表单数据,编码格式为gb2312。
http://127.0.0.1:8086/cgi-bin/test.cgi?name=%D5%C5%C8%FD&age=21&gender=%C4%D0&phonenum=13767898798&submit=%CC%E1%BD%BB
四、编写c语言代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BURSIZE 2048
int hex2dec(char c)
{
if ('0' <= c && c <= '9')
{
return c - '0';
}
else if ('a' <= c && c <= 'f')
{
return c - 'a' + 10;
}
else if ('A' <= c && c <= 'F')
{
return c - 'A' + 10;
}
else
{
return -1;
}
}
char dec2hex(short int c)
{
if (0 <= c && c <= 9)
{
return c + '0';
}
else if (10 <= c && c <= 15)
{
return c + 'A' - 10;
}
else
{
return -1;
}
}
void urldecode(char url[])//url解码函数,gb2312
{
int i = 0;
int len = strlen(url);
int res_len = 0;
char res[BURSIZE];
for (i = 0; i < len; ++i)
{
char c = url[i];
if (c != '%')
{
res[res_len++] = c;
}
else
{
char c1 = url[++i];
char c0 = url[++i];
int num = 0;
num = hex2dec(c1) * 16 + hex2dec(c0);
res[res_len++] = num;
}
}
res[res_len] = '\0';
strcpy(url, res);
}
int main()
{
char* str;
char name[100], gender[100], ch[100], phonenum[100];
char age[100];
printf("Content-type:text/html;charset=gb2312;\n\n");//告诉浏览器将以html的语法,gb2312的编码格式来解析此文件
str = getenv("QUERY_STRING");//获取通讯录网页提交的表单信息。
if (str == NULL)
return 0;
if (sscanf(str, "name=%[^&]&age=%[^&]&gender=%[^&]&phonenum=%[^&]&submit=%s", name, age, gender, phonenum,ch)) {
//使用sscanf()函数读取相关信息(使用正则表达式)
urldecode(name);//解码
urldecode(age);
urldecode(gender);
urldecode(phonenum);
FILE* fpWrite = fopen("data.txt", "a");//打开data.txt文件,”a“表示续写内容
if(fprintf(fpWrite, "%-25s%-10s%-10s%-20s\n", name, age, gender, phonenum))
printf("<script>alert('非常感谢,您的数据已经被保存!'); </script>");//浏览器弹窗提示信息
fclose(fpWrite);//关闭文件
}
printf("<html>\n");
FILE* fpRead = fopen("data.txt", "r");
printf("<table border=\"1\"width=\"600\"\n");//以表格形式读取文件
while (!feof(fpRead))
{
if (fscanf(fpRead, "%s %s %s %s", &name, &age, &gender, &phonenum)==NULL)
exit(-1);
else if(!feof(fpRead)) {
//避免文件最后一行重复输出
printf("<tr>\n");
printf("<td width=\"200\">\n%s\n</td>\n", name);
printf("<td width=\"100\">\n%s\n</td>\n", age);
printf("<td width=\"100\">\n%s\n</td>\n", gender);
printf("<td width=\"200\">\n%s\n</td>\n", phonenum);
printf("</tr>\n");
}
}
printf("</table>\n");
fclose(fpRead);
printf("</html>\n");
}
编译后,新的cgi程序会输出到Apache24\cgi-bin。
Apache24\cgi-bin中新建data.txt,第一行中输入姓名、年龄、性别等信息
在浏览器中重新打开通讯录网页127.0.0.1:8086测试功能。