CGI是指web服务器调用编程语言编写的程序的一个接口。比如我们可以编写一个用户注册的页面,用户将其输入的邮箱、用户名、密码输入并点击注册,此时浏览器就将用户输入的内容发送给了我们后台的CGI程序,我们的CGI程序接受到这些信息,可以对其进行处理。比如送入数据库、判断输入的信息是否合法等。

主流的CGI程序用Perl编写,Perl是一款强大的脚本语言,不过我这里不太懂,我也不去比较某两个语言间的优劣。我说一下用C和C++如何编写CGI程序,告诉大家用C语言也能编写web应用程序,用C语言也能写一个网站。

1.准备工作

首先要先安装一款web服务器。我就用windows系统下的Apache,当然Linux下大同小异,可能需要设置的东西多一些。

大家可以在apache官网下载最新版的Apache for Windows,天空也有下载:http://www.skycn.com/soft/1218.html。安装后打开安装目录,大致就是这样一些文件:

看到那个“cgi-bin”了吗,这是默认的cgi程序目录。当然,我们也可以手动设置其位置:用记事本打开conf/httpd.conf,这是Apache的配置文件。找到类似下面这一行

ScriptAlias /cgi-bin/ "d:/Program Files (x86)/Apache Software Foundation/Apache2.2/cgi-bin/"

"/cgi-bin/"表示web地址,比如默认是http://localhost/cgi-bin/,即访问cgi的根目录。"d:/Program Files (x86)/Apache Software Foundation/Apache2.2/cgi-bin/"表示对应的绝对路径。这应该不难理解,我们浏览器访问http://localhost/cgi-bin/就是代表访问了服务器上的相应的绝对路径。所以修改这个绝对路径,就可以指定我们的CGI程序存放的根目录。

我这里就不改了,一会我们写好的CGI程序直接放在这个cgi-bin文件夹下,再通过http://localhost/cgi-bin/访问即可。

2.开始写程序

用VS2010新建一个控制台应用程序工程,我的就叫cgi_test。在main函数里写

printf("Content-type:text/html\n\n");

printf("hello world!!");

当然也可以用C++的cout来代替printf输出。先别急着编译,我们先在工程上点右键,选择属性:

在配置设置-常规中,更改输出目录为cgi-bin下。我就改成cgi-bin\test\,这样我们生成的可执行文件就会被放在这里。目标文件的扩展名我也顺便从exe改成cgi,如果不改,迅雷等下载可能会让你下载而不是让浏览器解析它。

再就可以编译了。F7编译后,我们来到cgi-bin/test/中,就可以看到我们编译生成好的"cgi_test.cgi"文件。

打开浏览器,输入http://localhost/cgi-bin/test/cgi_test.cgi,就可以看到hello world了:

这就是我们的第一个cgi程序。

3.怎么写一个CGI程序

刚才写程序的工作是我来完成的,虽说那两个语句很简单,但有的同学会问为什么要这么写。

我简单解释一下,第一个printf输出的"Content-type:text/html\n\n"是一个文件的标志,告诉浏览器以html的语法来解析此文件,而不是去下载它(注意末尾需要两个换行,即一个空行,这是标准)。只要我们需要输出内容到浏览器,都得加这一句话在最前面,记住就好。

后面的printf就是输出到浏览器上的信息,注意需要用html的语法才能正常显示在浏览器上。比如换行,需要用
,而不是\n了。不懂的去学习关于html的知识(如果不学习html就别想做一个网站或web程序)。

所以,只要通过printf,就可以将任何html代码输出在浏览器里。而且,因为是用C/C++写的程序,所以C/C++下的一切函数,都可以用在CGI程序里。(也包括windowsAPI)

比如,用户填写好了注册表单,将信息传递给我的CGI程序,我就可以调用ODBC的函数,连接数据库,将信息写入数据库。也可以通过if判断句,来检查用户是否输入了非法信息。

不过有同学又要问了,用户填写的信息怎么就传给我们的CGI程序了呢?程序又是怎么接受这些数据?

4.接受GET或POST来的信息

如果不知道GET和POST的意思,我建议你还是去看一下PHP。我这里只简单地提一下,我们新建一个html网页,在其中添加一个表单,其中有一个文本框和一个按钮,大致代码如下:

输入内容:

大家可以看到,form有个属性method,表示你用什么方式提交(post或get),action属性表示提交的地址。get方式提交,意思就是把提交的内容放在地址后面,用?隔开。post提交就是把数据放在数据包里发送给目标地址。我们在文本框内填入信息,点击按钮提交,我们填入的信息就会以相应方式发送到目标地址。

C程序接受POST过来的信息比较简单。因为post来的信息都在输入流里,直接scanf或cin>>就能读取了。

GET来的信息在地址栏里,我们需要用到一个C库中的函数:getenv,它的作用是获取环境变量,其中包括获取GET来的信息。(获取?后的所有内容:getenv("QUERY_STRING"))

关于这个函数的所有用法我放在附件里,下载可查。

5.做个示范

int _tmain(int argc, _TCHAR* argv[])

{

printf("Content-type:text/html\n\n");

printf("%s",getenv("QUERY_STRING")); //打印get获取的信息

char szPost[256];

gets(szPost);

if(strcmp(szPost,))

printf("%s",szPost); //打印post获取的信息

return 0;

}

用我们刚才的html代码来提交:

填入内容:

post方式获取的信息,注意地址栏:

get方式获取的信息,注意地址栏:

至于get方式获取的信息打印出来后面为什么有乱码,因为我顺便把没有信息的szPost也打印了。实际应用的时候应该先判断szPost中是否有信息再打印。

今天写的够多了。大致C/C++处理CGI就是这样子,你可以发挥自己的想象,写出一些具有使用价值的程序。我们下次给大家讲一个库,通过这个库,可以很轻松的使用cgi编写web应用程序。

c语言 cgi php,C语言CGI编程入门(一)相关推荐

  1. 【C语言】初始C语言系列 代码详解 _ 编程入门 _【内附代码和图片】_ [初阶篇 _ 总结复习]

    [前言] 本篇文章为初始C语言部分,C语言是编程的入门语言,所以也说是编程入门: 学好C语言的入门内容,才能真正的入门编程,而C语言的学习对于刚入门的同学还是有一些难度的,需要踏踏实实的自己去理解. ...

  2. 用c语言编一元二次方程的思路,[编程入门]自定义函数求一元二次方程 (C语言代码)...

    解题思路:题目要求的是调用三个函数分别解决当根的判别式大于0.小于0等于0的三种情况,分别调用不同的函数来解出方程的x1和x2 注意事项: 参考代码: #include #include //根的判别 ...

  3. 树莓派WEB服务器(Boa)CGI编程入门

    通过上一个课程"Boa基本设置与使用"的学习,大家在树莓派上应已经会安装.配置.运行Boa服务器,并且访问到服务器上的一个静态网页. 这不是运行Web服务器最终的目的,最终应是通过 ...

  4. python语言编程入门-Python编程从入门到精通 PDF 下载

    相关截图: 资料简介: 本书循序渐进.由浅入深地详细讲解了Python语言开发技术,并通过具体实例演练了各个知识点的具体使用流程.全书共23章,其中第1-2章是基础知识部分,讲解了Python语言开发 ...

  5. 学单片机需要多少C语言基础,C语言单片机编程教程

    很多学员和朋友经常找我给他们推荐C语言的书,他们可能想和我当年一样,闷头大干一场,学个几个月的C语言,把C语言吃透,再开始单片机程序开发! 别!别!别! 大家千万别这么干,我当年自学了3个月的C语言, ...

  6. 语言翻译成汇编语言_学习编程有没有必要从C语言和C++学起?应该怎么学?

    硬件层级:这里也就是实体硬件,包括:CPU.内存.显卡等等...这些都不属于软件的范畴内. 汇编层级:在之前没有C/C++以及java之前,是汇编的年代.那么汇编语言对于我们来说,可读性是很查的,不适 ...

  7. 编程入门python语言是多大孩子学的-我的孩子需要学习Python吗?几岁开始学?有什么书籍推荐?...

    原标题:我的孩子需要学习Python吗?几岁开始学?有什么书籍推荐? 最近有一些家长问我,需不需要让孩子学习Python,孩子学习Python有什么作用? 最近确实有看到不少的机构在宣传Python, ...

  8. 编程入门python语言是多大孩子学的-如何看待将Python作为少儿编程的基础语言?...

    少儿编程入门我只推荐Scratch!不好意思,Python先靠后! 今天的回答主要针对Scratch编程语言,看完我的回答你就知道为什么我会强推Scratch! 本回答较长,建议大家先点赞&收 ...

  9. python和c哪个适合入门-编程入门选什么语言好?C 语言还是Python ?为你解析

    前面我分享过计算机行业已经成了学校选择排名第一,家长和学生都很看好计算机类专业.现在IT行业也越来越火爆,程序员越来越被人看好.面对相比同龄人高薪资的诱惑,人们很难不心动,即使秃头也值得! 那么问题来 ...

  10. 编程入门python语言是多大孩子学的-包头孩子学编程python好吗

    包头孩子学编程python好吗,学习少儿编程就选童程童美,童程童美专注3-18岁少儿编程教育.历时多年,形成了以创意启蒙课程.人工智能编程.智能机器人编程.信息学奥赛编程等课程为核心的一站式编程教育平 ...

最新文章

  1. 2.4 Go语言基础之切片
  2. 【深度学习】高效读取数据的方法(TFRecord)
  3. 导出到Excel的操作
  4. 中国数据库OceanBase登顶之路
  5. SecureCRT安装
  6. 传音控股回应“遭华为起诉侵权”:未收到起诉状 科创板上市不受影响
  7. mysql8没有cmakelist_CentOS7安装mysql8.0编译报错集合
  8. Mybatis返回类型和接收参数为Map类型
  9. intel32指令中文版
  10. 台电t30_这次我真的是服了,8000mA的T30续航力真心不虚
  11. mysql数据库文件结构同步,[数据库的表同步mysql]MySQL表结构同步
  12. Windows 上路由、端口转发配置
  13. flex布局下文字超出省略号代替不起作用解决方法
  14. 前端如何将静态页面部署到服务器,并可以通过公网ip访问。
  15. 2015 ACM Arabella Collegiate Programming Contest(F题)
  16. padStart(),padEnd()方法
  17. C++长整型(long long)64位整型耗时问题
  18. 冲击红队第一天 - Web安全介绍与基础入门
  19. WordPress不可忽视的面包屑导航SEO优化技巧
  20. 数字图像处理第十章 图像分割

热门文章

  1. linux 修改终端字体,linux系统终端修改字体的方法
  2. SQL2000远程连接不了的问题
  3. Gallery2源码阅读图片编辑
  4. 打开 OpenAI 的职场之路 - 微软学生开发者峰会
  5. Tessent shell edt_update / edt clock 时序以及组合
  6. xplorer文件管理下载 | xplorer2 Professional Ultimate(文件管理器)官方中文版V5.0.0.0 | 文件管理器哪个好用
  7. python代码实现批量yunfile文件下载
  8. Python字符串切片操作
  9. 研究生必备科研工具,你都用了吗
  10. 如何在中国知网上查询最新的学术期刊的级别?