C语言CGI编程入门(一)

C语言CGI编程入门(一)

http://www.leavesongs.com/WEB/CGIforC_1.html

    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函数里写

1 printf("Content-type:text/html\n\n");
2 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的语法才能正常显示在浏览器上。比如换行,需要用<br />,而不是\n了。不懂的去学习关于html的知识(如果不学习html就别想做一个网站或web程序)。

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

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

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

    4.接受GET或POST来的信息

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

1 <form id="form" name="form" method="post" action="http://localhost/cgi-bin/test/cgi_test.cgi">
2   <p>输入内容:
3     <input type="text" name="user" id="user" />
4   </p>
5   <p>
6     <input type="submit" name="submit" id="submit" value="提交" />
7   </p>
8  
9 </form>

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

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

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

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

    5.做个示范

01 int _tmain(int argc, _TCHAR* argv[])
02 {
03     printf("Content-type:text/html\n\n");
04     printf("%s",getenv("QUERY_STRING")); //打印get获取的信息
05     char szPost[256];
06     gets(szPost);
07     if(strcmp(szPost,))
08             printf("%s",szPost); //打印post获取的信息
09     return 0;
10 }

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

    填入内容:点击查看原图

    post方式获取的信息,注意地址栏:点击查看原图

    get方式获取的信息,注意地址栏:点击查看原图

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

  • 18
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介回到顶部↑ 本书是专为在UNIX平台下用C语言编制程序的人写的。是以POSIX为标准,主要以C语言为基础,详细介绍了UNIX平台下编写各种应用程序的范例和方法。全书分四个部分,共十五章。本书范例丰富,且具有代表性,如Socket编程、客户/服务端编程、多线程开发、CGI编程、X Windows下的Motif编程等。读者直接或只需稍作修改就可以将它们应用到自己的应用程序开发中。这些范例的源代码可以从配套光盘的电子书中直接拷贝使用。 目录回到顶部↑ 第一部分 基本的系统调用 第1章 文件子系统 1.1 文件子系统的基本概念 1.2 基本的文件输入和输出 1.3 高级的文件操作 第2章 终端操作 2.1 终端的基本概念 2.2 终端输入和输出 2.3 ioctl系统调用 第3章 进程及进程间通信 3.1 进程的基本概念 3.2 进程的一般操作 3.3 进程的特殊操作 3.4 进程间使用管道通信 第4章 信号 4.1 信号的基本概念 4.2 信号机制 4.3 有关信号的系统调用 第5章 部分其他调用 5.1 系统调用 .5.2 相关函数 第二部分 网络编程 第6章 Socket编程基础 6.1 TCP/IP基础知识 6.2 Socket一般描述 6.3 Socket中的主要调用 6.4 Socket的原始方式 第7章 客户/服务器编程 7.1 客户端程序设计 7.2 服务器端程序设计 7.3 服务端程序结构 7.4 多协议(TCP、UDP)服务端 7.5 客户端的并发程序设计 7.6 使用telnet协议的客户端例子 第8章 线程 8.1 有关线程的基本概念 8.2 线程的创建和终止 8.3 线程控制调用 8.4 线程之间的互斥 8.5 线程之间的同步 8.6 线程特定数据区的函数调用 8.7 一个使用线程的客户端并发的例子 8.8 有关线程的函数列表 第9章 CGl编程 9.1 CGI程序的基本概念 9.2 CGI基本编程 9.3 使用脚本语言编写CGl 9.4 Perl语言简介 9.5 一个简单的CGI例子 第三部分 X Window应用程序开发 第10章 X Window和Motif基础 10.1 简介 10.2 XWindow基本概念 10.3 启动Motif窗口管理器 10.4 设置Motif特性 10.5 Widget 第11章 Motif编程 11.1 基本编程概念 11.2 Widget资源 11.3 Motif编程基础 11.4 程序框架 11.5 "HelloWorld!"示例 11.6 管理器 11.7 按钮 11.8 X事件 11.9 其他Widget简介 11.10 菜单 11.11 对话框 第12章 Widget与X事件汇总 12.1 Widget 12.2 X事件 第四部分 常用的编程工具 第13章 编译器及调试工具 13.1 编译器用法入门 13.2 调试器使用入门 13.3 关于库的简介 第14章 Make工具及makefile规则 14.1 概述 14.2 make和makefile的关系 14.3 makefile规则 14.4 伪指令 14.5 make命令行参数 第15章 版本控制 15.1 版本控制概念 15.2 源代码控制系统SCCS 15.3 RCS使用方法 15.4 并发版本控制CVS

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值