现在的位置: 首页 > 综合 > 正文

Linux下搭建Web服务器并用C语言编写CGI

2013年08月30日 ⁄ 综合 ⁄ 共 3806字 ⁄ 字号 评论关闭

最近一直在学习Linux学习编写CGI, 刚刚完成了一个留言本, 把自己的心得写出来与大家分享, 不正确的地方请高手指正.

(一)Linux的安装.
       我安装的是RedHat9(版本老了一点, Linux2.4内核), 使用KDE(感觉比GNOME漂亮), KDE中的编辑器带有多种语言的语法加亮功能, 尤其是Kate内置命令行, 用来编写程序非常的方便. Linux下的Web服务使用Apache(类似Windows里的IIS), 数据库的话可以安装MySql(新手入门推荐). 这两样东西RedHat的安装盘上都有了.
       我没有安装RedHat自带的Apache和MySql, 而是去官方网站下载最新的源代码包自己编译安装的(觉得我这种Linux新手还是用源代码包安装, 不用RPM). Apache和MySql的安装后面再说.
(二)Apache的安装
       可以去
http://httpd.apache.org/download.cgi下载最新的Apache源代码包, 下载并解压后就要开始编译并安装了, 可以在终端敲入以下命令(我用的bash Shell):
cd /root/apache-src                                          假设/root/apache-src是你解压后的源代码的路径
./configure --prefix=/usr/local/apache           prefix参数后面的路径就是你想把apache安装到哪里. 一般大型软件都是用/usr/local/....
make
make install
       如果上面几布没出错的话, apache就已经被安装好了. /usr/localapache目录下会有多个子目录, 其中/bin目录包含了可执行文件, /htdocs存放你的一般网页, /cgi-bin存放你的cgi程序, /conf中存放服务器配置文件
       你可以在环境变量PATH中加入/usr/local/bin目录方便你执行程序. /bin中的httpd程序就是apache服务的守护程序. 你可以在终端中输入httpd来启动它. 在你的浏览器中输入
http://127.0.0.1检验你的服务器是否启动.
       打开/conf目录下的httpd.conf你就可以编辑服务器的配置信息了. 具体的条目看的懂英文的话就很容易了, 不懂就Google一下了.
(三)MySql的安装
       和Apache一样一样底. 下载源代码包编译安装. 同样安装目录使用/usr/local/mysql好了, 然后把/bin目录加到PATH环境变量里.
       安装完成后要进行数据库的初始化工作(初始化用户权限等), 在/bin里有个mysql_install_db的脚本可以完成这些工作. 初始化后数据库会创建一个root超级用户(没有密码). 
       执行/bin文件夹里的mysqld_saef脚本就可以起动MySql服务器了. 增删用户修改密码和客户端的使用方法可以查阅中文手册(
http://www.linuxforum.net/books/mysqlmanual/manual_toc.html)
要在C语言里进行MySql编程的话头文件和库文件是少不了的, 他们在安装目录的/inlude和/lib里, 在C语言里只要使用#include "/usr/local/mysql/include/mysql/mysql.h"就可以进行基本的MySql编程了.
如果你觉得这个目录太长的话, 你可以在/usr/include(这是gcc编译器使用的包含路径)里加入MySql文件夹链接, 具体命令是ln -s /usr/local/mysql/include/mysql /usr/include/mysql, 这样你就可以#include "mysql/mysql.h"了. gcc默认使用的库文件路径是/usr/lib, 同样可以建立文件夹链接.
(四)建立数据库,为留言本建立表格
       敲入命令"mysql -u root -p", 输入密码后登录MySql服务器, 
       敲入命令"create database db_site;", 创建好数据库, 然后"use it".
       敲入命令"create table note (id int primary key auto_increment, name varchar(20), ntime datatime, content varchar(300) );" , 建立note表存放留言, id列的auto_increment类似SqlServer里而的Identity属性。
       以下是一段典型的查询代码(当然这段代码是不安全的, 它没有对函数的返回值进行检查)
  #include "mysql/mysql.h"
  ......
  MYSQL_RES *gl_res=NULL;
  MYSQL gl_mysql;
  MYSQL_ROW gl_row;
  mysql_init(&gl_mysql);//填入初始化信息, 比如客户端IP
  mysql_real_connect(&gl_mysql, NULL, "testuser", "password", "db_site", 0, 0, 0);//连接数据库db_site
  mysql_query(&gl_mysql, "select count(*) from note;");//查询数据条目数量
  gl_res = mysql_store_result(&gl_mysql)'//保存选择后的结果, 对于insert这样的指令就没用了
  gl_row=mysql_fetch_row(gl_res);/取出结果集合中的第一行
  count = atoi(gl_row[0]);//第一行第一列就是要得到的数据, 把它转换成int
  mysql_free_result(gl_res);//释放保存的结果
  mysql_close(&gl_mysql);//关闭链接
       编译是需要使用gcc的L参数指定查找路径, 在我的电脑上是这样的 gcc -o note main.c -L/usr/lib -lmysqlclient -lz  .(我把库文件都拷贝到/usr/lib目录下了)
       PS : 现在的gcc支持C++式的注释和bool型变量的, 爽啊!
(五)编写CGI程序
       网上CGI的教程很多, 但是大都用的Perl, 用C语言的比较少, 用C语言的一个麻烦之处在于你要自己编写各种字符串处理函数(http协议是基于字符流的). 如果你还没有CGI程序的基本认识, 应当Google一下, 了解CGI环境变量和POST/GET方法的异同. 还有你需要对HTML和URL编码有些了解. 如果利用GET方法, 那么CGI程序就会接收受输入到环境变量QUERY_STRING的编码表单. 如果利用POST方法, 你的CGI程序将会接收输入到stdin的编码表单. 服务器将不会在数据的结尾再发送一个EOF, 相反你应该使用环境变量CONTENT_LENGTH来决定多少数据你要从stdin中读出。
       在C语言中使用char *getenv(char *)函数来得到一个环境变量的值. CGI程序接收到的客户数据是经过URL编码过的, 使用C语言你要自己编写代码对接收到的数据进行URL解码(其他语言都提供了很好的解码函数). 我在解码的过程中使用了自己以前写的语法分析器(换一套状态转换图就可以使用了).
       语法分析器可以在我的blog里找到的, 这是最新版的状态转换图:
 {NUMBER,'0','9',NUMBER},
 {NUMBER,'A','Z',IDENTI},
 {NUMBER,'a','z',IDENTI},
 {NUMBER,'%','%',IDENTI},
 {NUMBER,45,46,IDENTI},//'-''.'
 {NUMBER,'_','_',IDENTI},
 {NUMBER,42,43,IDENTI},//'*''+'
 {IDENTI,'A','Z',IDENTI},
 {IDENTI,'a','z',IDENTI},
 {IDENTI,'%','%',IDENTI},
 {IDENTI,'0','9',IDENTI},
 {IDENTI,45,46,IDENTI},//'-''.'
 {IDENTI,'_','_',IDENTI},
 {IDENTI,42,43,IDENTI},//'*''+'
 {START,'&','&',ADDR},
 {START,'=','=',ASSIGN},
 {START,'0','9',NUMBER},
 {START,'A','Z',IDENTI},
 {START,'a','z',IDENTI},
 {START,'%','%',IDENTI},
 {START,45,46,IDENTI},//'-''.'
 {START,'_','_',IDENTI},
 {START,42,43,IDENTI},//'*''+'
       CGI程序写完后放到/cgi-bin目录下(这是apache默认的cgi路径, 当然可以改的), 浏览器中键入
http://127.0.0.1/cgi-bin/****就可以看到你的CGI运行结果了.

抱歉!评论已关闭.