文章目录
自学,手打,希望多多点赞评论支持,让更多需要的人看见!——花前月
一、配置CGI运行环境——Apache下载安装
下载
阿帕奇豪斯下载 (apachehaus.com)

解压缩

修改配置
修改conf/httpd.conf

修改Apache存放路径为解压路径
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBM88YgN-1654222086601)(image/image_FgPvtFEhdn.png)]](https://img-blog.csdnimg.cn/fbd01be511c24dc68f9e799e9baa916e.png)
修改监听窗口为8086

修改Server Name为127.0.0.1
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XDaN7o2W-1654222086602)(image/image_j1lR98tbdZ.png)]](https://img-blog.csdnimg.cn/544c855a9ff040de80255e1c2b17f15f.png)
修改conf/extra/httpd-ahssl.conf和httpd-ssl.conf
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bN15fwS6-1654222086602)(image/image_ssPGE26qu5.png)]](https://img-blog.csdnimg.cn/f0170b946bad46f4bdcfac79acd9c99e.png)
将两个文件的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><metacharset="gb2312"><!--规定 HTML 文档的字符编码--></head><body><formid="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>姓名
<inputtype="text"id="name"name="name"/><!--文本框--></P><p>年龄
<selectid="age"name="age"><!--下拉框--><optionvalue="18"selected="selected">18</option><optionvalue="19">19</option><optionvalue="20">20</option><optionvalue="21">21</option></select></p><P>性别
<inputtype="radio"id="men"name="gender"value="男"/>男
<inputtype="radio"id="women"name="gender"value="女"/>女
<!--单选框--></P><P>手机
<inputtype="text"id="phonenum"name="phonenum"/><!--文本框--></P><p><inputtype="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('请填写姓名!');returnfalse;}elseif(!(m.checked||w.checked)){alert('请选择性别!');returnfalse;}elseif(p.value==''||p.value==null){alert('请填写手机号');returnfalse;}}</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>#defineBURSIZE2048inthex2dec(char c){if('0'<= c && c <='9'){return c -'0';}elseif('a'<= c && c <='f'){return c -'a'+10;}elseif('A'<= c && c <='F'){return c -'A'+10;}else{return-1;}}chardec2hex(shortint c){if(0<= c && c <=9){return c +'0';}elseif(10<= c && c <=15){return c +'A'-10;}else{return-1;}}voidurldecode(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);}intmain(){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)return0;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);elseif(!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测试功能。




版权归原作者 WMX_0121 所有, 如有侵权,请联系我们删除。