码迷,mamicode.com
首页 > 其他好文 > 详细

《cgic编程 (二) — 实例 》

时间:2020-07-08 20:16:17      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:文件   The   目录   工作方式   arp   工作   文件中   style   extern   

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编程 (二) — 实例 》

标签:文件   The   目录   工作方式   arp   工作   文件中   style   extern   

原文地址:https://www.cnblogs.com/zhuangquan/p/13268729.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!