【Web】cgic简介

简介

cgic是一个C库,用来支持CGI编程,该库符合ANSI-C标准,所以有较好的移植性。

这里将使用MinGW作为编译器,依赖cgic库,完成基本的CGI的开发。

cgic库源码可以在https://github.com/boutell/cgic下载到,MinGW的安装可以参考[C++]环境配置和使用

将下载到的cgic库(其实就是几个c文件和h文件),放到cgi-bin目录下,如下所示:

cgic源码

红框部分就是源码,主要还是cgic.c和cgic.h两个文件,其它的两个文件其实是测试用的。Makefile也是cgic的一部分,不过经过了修改,以下是修改之后的内容:

CFLAGS=-g -Wall
CC=gcc
AR=ar
RANLIB=ranlib
LIBS=-L./ -lcgic

OBJECTS = cgictest.cgi

all: libcgic.a $(OBJECTS)

libcgic.a: cgic.o cgic.h
	$(AR) rc libcgic.a cgic.o
	$(RANLIB) libcgic.a

%.cgi: %.o libcgic.a
	$(CC) $< -o $@ ${LIBS}

clean:
	del *.o *.a *.cgi

配置好MinGW之后,直接在当前目录执行make就可生成库文件libcgic.a和测试CGI文件cgictest.cgi。

通过在网页输入http://localhost/cgi-bin/cgictest.cgi

cgictest
以上是cgic库自带的例子,下面将使用cgic库来编译一个简单的示例(cgi-bin\hellocgic.c):

// include the cgic.h.
#include "cgic.h"

// CGi using cgic has the entry of cigMain.
int cgiMain()
{
    // Send the content type, letting the browser know this is HTML.
    cgiHeaderContentType("text/html");
    // Ouput HelloWorld page.
    fprintf(cgiOut, "<html>\n");
    fprintf(cgiOut, "<head>\n");
    fprintf(cgiOut, "<title>Hello CGIC</title>\n");
    fprintf(cgiOut, "</head>\n");
    fprintf(cgiOut, "<body>\n");
    fprintf(cgiOut, "<h2>Hello CGIC! I am a CGI!</h2>\n");
    fprintf(cgiOut, "</body>\n");
    fprintf(cgiOut, "</html>\n");

    return 0;
}

然后将hellocgic.cgi写入Makefile文件,主要修改下面一行,增加hellocgic.cgi:

OBJECTS = cgictest.cgi hellocgic.cgi

之后make编译之后得到hellocgic.cgi。在网页输入http://localhost/cgi-bin/hellocgic.cgi:

hellocgic
回到代码,相比于helloworld.cgi代码,这里的主要差异是:

  • 入口不再是main(),而是cgiMain(),真正的main()函数实际上在cgic.c中:
int main(int argc, char *argv[]) {
    int result;
    // 中间略
    result = cgiMain();
    return result;
}
  • 使用cgiHeaderContentType()来声明网页类型,其实现没有什么特别的:
void cgiHeaderContentType(char *mimeType) {
	fprintf(cgiOut, "Content-type: %s\r\n\r\n", mimeType);
}
  • 使用cgiOut来输出,而不是像之前那样用printf(),这里的cgiOut是一个FILE*类型的全局变量,在main()函数中有初始化:
cgiOut = stdout;

所以本质上跟printf()也没有差异。

以上一个最简单的cgic库示例,后面将更详细的介绍cgic库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值