《cgic编程 — 实例 》

Posted zhuangquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《cgic编程 — 实例 》相关的知识,希望对你有一定的参考价值。

1.向浏览器打印信息

1.c

#include <stdio.h>
#include "cgic.h"
#include <string.h>
#include <stdlib.h>
int cgiMain() {
    cgiHeaderContentType("text/html");
    fprintf(cgiOut, "<HTML><HEAD>/n");
    fprintf(cgiOut, "<TITLE>My First CGI</TITLE></HEAD>/n");
    fprintf(cgiOut, "<BODY><H1>Hello CGIC</H1></BODY>/n");
    fprintf(cgiOut, "</HTML>/n");
    return 0;
}

  gcc 1.c  -o  1.cgi  -lcgic。

  将1.cgi放在/var/www/cgi-bin/中

  技术图片

 

 

2.获得Get请求字符串

  Get请求就是我们在浏览器地址栏输入URL时发送请求的方式,或者我们在HTML中定义一个表单(form)时,把action属性设为“Get”时的工作方式;

  Get请求字符串就是跟在URL后面以问号“?”开始的字符串,但不包括问号。比如这样的一个请求:http://127.0.0.1/cgi-bin/out.cgi?ThisIsTheGetString

  在上面这个URL中,“ThisIsTheGetString”就是Get请求字符串。

  在进入我们自己编写的cgi代码之前,CGIC库已经事先把这个字符串取到了,我们可以在程序中直接获得,要做的仅仅是在你编写的cgiMain方法前面加入以下声明:

extern char *cgiQueryString;

实例:

#include <stdio.h>
#include "cgic.h"
#include <string.h>
#include <stdlib.h>

extern char *cgiQueryString;

int cgiMain() {
	cgiHeaderContentType("text/html");
	fprintf(cgiOut, "<HTML><HEAD>/n");
	fprintf(cgiOut, "<TITLE>My CGIC</TITLE></HEAD>/n");
	fprintf(cgiOut, "<BODY>");
	fprintf(cgiOut, "<H1>%s</H1>",cgiQueryString);
	fprintf(cgiOut, "</BODY>/n");
	fprintf(cgiOut, "</HTML>/n");
	return 0;
}

  编译以上程序为2.cgi。

  在浏览器中输入http://127.0.0.1/cgi-bin/2.cgi?ThisIsTheGetString。

  技术图片

 

 

3.通过html中表单访问对应的cgi

test.html

<html>
	<head>
	<title>Test</title>
	</head>
	
	<body>
		<form action="cgi-bin/out.cgi" method="get">
			<input type="text" name="theText">
			<input type="submit" value="Continue →">
		</form>
	</body>
</html>

  将test.html放在/var/www/目录下。

  技术图片

 

   点击continue

  技术图片

   其中“+”就是空格,因为url会把空格传输的以用"+"替换。

 4.反转义

  浏览器在发送Get请求时,会把请求字符串进行转义操作(英文术语为: escape); 比如,我们在地址栏输入(注意最后”it’s me”中的空格):

  http://localhost/~Jack/cgi-bin/out.cgi?it‘s me

  浏览器会把它转义为:

  http://localhost/~Jack/cgi-bin/out.cgi?it‘s%20me

 

  在上一篇最后给出的例子中,如果在文本框内输入:it‘s me

  浏览器最终发送的请求为:http://localhost/cgi-bin/2.cgi?theText=it%27s+me

  但是最终显示为:theText=it%27s+me

  通过CGIC,我们可以把这些被转义后的字符还原为我们本来的输入,这个过程就叫“反转义” (Unescape)。

整个过程分三个步骤:

1)打开cgic.c,找到这一行语句

static cgiUnescapeResultType cgiUnescapeChars(char **sp, char *cp, int len);

  注意,我们要找的只是这个函数声明,不是函数定义。

2)在这个函数声明语句的上方,你会看到一个结构体定义

typedef enum {
    cgiUnescapeSuccess,
    cgiUnescapeMemory
} cgiUnescapeResultType;

  把这几行语句复制到cgic.h文件中,并在这里把它注释掉。

  同时还要删除在第一步中找到的函数声明语句中的“static”关键字。

3)我们现在就可以使用反转义函数cgiUnescapeChars了

  在你自己的代码(按照惯例,还是test.c)中,加入以下声明语句即可

extern cgiUnescapeResultType cgiUnescapeChars(char **sp, char *cp, int len);

实例:

#include <stdio.h>
#include "cgic.h"
#include <string.h>
#include <stdlib.h>

extern char *cgiQueryString;
extern cgiUnescapeResultType cgiUnescapeChars(char **sp, char *cp, int len);
int cgiMain() {
	char * buffer;
	
	cgiHeaderContentType("text/html");
	fprintf(cgiOut, "<HTML><HEAD>/n");
	fprintf(cgiOut, "<TITLE>My CGI</TITLE></HEAD>/n");
	fprintf(cgiOut, "<BODY>");
	cgiUnescapeChars(&buffer, cgiQueryString, strlen(cgiQueryString));
	fprintf(cgiOut, "<H1>%s</H1>",buffer);
	fprintf(cgiOut, "</BODY>/n");
	fprintf(cgiOut, "</HTML>/n");
	free(buffer);
	
	return 0;
}

  

 

 

 

 

 

 

  

 

  

 

以上是关于《cgic编程 — 实例 》的主要内容,如果未能解决你的问题,请参考以下文章

用php写一个网页程序,功能是判断服务器上QQ程序运行了多长时间

cgic简介

使用cgic库搭配ctemplate编写cgi程序

Web之CGIC的介绍与使用20171229

CGIC库之get与post请求二 多路温度

boa服务器移植与CGIC库的安装使用