c语言cgi函数库,cgic: 为C语言编写CGI的C函数库

CGIC介绍

怎样写CGIC应用程序

怎样产生图片在CGIC中?

CGI调试特征: 利用捕获

cgic函数参考

cgic变量参考

cgic结果编码参考

cgic快速索引

一般的Unix系统都支持ANSIC,增加相应的库函数(和相应的h文件)就可以实现CGI。在此我向大家推荐一个用于CGI编程的ANSIC库:cgic。

cgic是用来生成基于CGI的WWW应用程序的C语言函数库,它有以下功能:

*对数据进行语法分析

*接收以GET和PSOT两种方式发送的数据

*把FORM中的不同域连接成连续的串

*为检索FORM数据而提供字符串,整数,浮点以及单项和多项选择功能

*为数字字段提供边界检测

*把CGI环境变量加载到非空的C串中

*为调试而捕捉CGI状态

*提供相对安全的系统调用功能

用一般ANSI C或C++编译器就可以编译cgic程序,不过与通常C程序不同的是,用cgic写的源码其主函数是cgiMain(),而不是通常的main()。cgic的函数库会自动把cgiMain连接到相应的main()上去。

--------------------------------------------------------------------------------

写CGIC程序

Note: 所有的cgic应用程序必须连接cgic.c.

用cgimain()替代main() 必须包含: #include"cgic.h."

基本结构cgictest.c:

int cgiMain() {

#if DEBUG

cgiReadEnvironment("/path/to/capcgi.dat");

#endif

cgiHeaderContentType("text/html");

fprintf(cgiOut, "\n");

fprintf(cgiOut, "cgic test\n"):

fprintf(cgiOut, "

cgic test\n");

Name();

Address();

Hungry();

Temperature();

Frogs();

Color();

Flavors();

NonExButtons();

RadioButtons();

fprintf(cgiOut, "

\n");

return 0;

}

capture

输出标头

cgiHeaderContentType()在输出文挡之前简要说明MIME内型,如 "text/html"。

cgiHeaderStatus()代替输出错误代码 cgiHeaderLocation()代替重新引导至其他页面。在一个独立的应用程序中只能有一个cgiHeader函数。

重点:在cgiHeader函数组中, cgiHeaderContentType(), 在任何向浏览器输出之前被调用. 否则将出错或浏览器不能识别。 cgiOut

接着, cgiMain() 调用不同的函数.当函数结束后,将返回0

处理输入文本

void Name() {

char name[81];

cgiFormStringNoNewlines("name", name, 81);

fprintf(cgiOut, "Name: %s

\n", name);

}

这个函数的功能就是取的并显示由用户输入的name .

处理输出

Important: cgiOut通常相当于stdout

cgiFormString 确保断航

处理单一Checkboxes输入

这个Hungry() function确定用户是否选择"hungry"这个 checkbox:

void Hungry() {

if (cgiFormCheckboxSingle("hungry") == cgiFormSuccess) {

fprintf(cgiOut, "I'm Hungry!

\n");

} else {

fprintf(cgiOut, "I'm Not Hungry!

\n");

}

}

这个函数依靠 cgiFormCheckboxSingle() 确定单一的checkbox 被选择。 cgiFormCheckboxSingle() 接受checkbox名字的属性值,如果存在就返回 cgiFormSuccess,否则返回cgiFormNotFound 如果是多项checkboxes,就用 cgiFormCheckboxMultiple()和cgiFormStringMultiple() 函数.

处理数字输入

Temperature() 返回浮点书的值确保在特定的返回内。

void Temperature() {

double temperature;

cgiFormDoubleBounded("temperature", &temperature, 80.0, 120.0, 98.6);

fprintf(cgiOut, "My temperature is %f.

\n", temperature);

}

依靠cgiFormDoubleBounded()得到数据.第一个数据是返回数据中输入域的名字。最后一个值是用户没有提交时的默认值。

这个函数总是找回在特定返回内合适的值; cgiFormDoubleBounded返回的值被检查确信用户输入的资料在规定范围内,而不是其他无效的数据。查看 cgiFormDoubleBounded() 更多的资料. 如果限度检查不理想,可以用 cgiFormDouble() 替代.

在整数输入,cgiFormInteger 和 cgiFormIntegerBounded 可以利用. 这些函数的功能类似.

处理单一选择输入

HTML标签被用于向用户提供几个选择. Radio buttons 和checkboxes 椰油这样的用途,大门、能够选择的数量很小时. Color()

char *colors[] = {

"Red",

"Green",

"Blue"

};

void Color() {

int colorChoice;

cgiFormSelectSingle("colors", colors, 3, &colorChoice, 0);

fprintf(cgiOut, "I am: %s

\n", colors[colorChoice]);

}

这个函数确定用户选择了几个选项从在表但的列表. cgiFormSelectSingle()

cgiFormSelectSingle() 总是显示合理的选项值.

radio button也可以用这个函数.另外还有 cgiFormRadio(), 也是一样的

处理多项选择的输入

NonExButtons()

char *votes[] = {

"A",

"B",

"C",

"D"

};

void NonExButtons() {

int voteChoices[4];

int i;

int result;

int invalid;

char **responses;

fprintf(cgiOut, "Votes (method 1):

\n");

result = cgiFormCheckboxMultiple("vote", votes, 4,

voteChoices, &invalid);

if (result == cgiFormNotFound) {

fprintf(cgiOut, "I hate them all!

\n");

} else {

fprintf(cgiOut, "My preferred candidates are:\n");

fprintf(cgiOut, "\n");

for (i=0; (i < 4); i++) {

if (voteChoices[i]) {

fprintf(cgiOut, "

%s\n", votes[i]);

}

}

fprintf(cgiOut, "\n");

}

参考cgiFormCheckboxMultiple(), cgiFormSelectMultiple().

cgiFormCheckboxMultiple() cgiFormCheckboxMultiple

NonExButtons() 函数在 cgictest.c:

fprintf(cgiOut, "Votes (method 2):

\n");

result = cgiFormStringMultiple("vote", &responses);

if (result == cgiFormNotFound) {

fprintf(cgiOut, "I hate them all!

\n");

} else {

int i = 0;

fprintf(cgiOut, "My preferred candidates are:\n");

fprintf(cgiOut, "\n");

while (responses[i]) {

fprintf(cgiOut, "

%s\n", responses[i]);

i++;

}

fprintf(cgiOut, "\n");

}

cgiStringArrayFree(responses);

}

参考cgiFormStringMultiple()

cgiFormStringMultiple()

char **responses;

cgiFormStringMultiple("vote", &responses);

检查CGI环境变量

将用到的变量 这里,

产生图象

#include "cgic.h"

#include "gd.h"

char *colors[] = {

"red", "green", "blue"

};

#define colorsTotal 3

int cgiMain() {

int colorChosen;

gdImagePtr im;

int r, g, b;

im = gdImageCreate(64, 64);

r = gdImageColorAllocate(im, 255, 0, 0);

g = gdImageColorAllocate(im, 0, 255, 0);

b = gdImageColorAllocate(im, 0, 0, 255);

cgiFormSelectSingle("color", 3, &colorChosen, 0);

switch(colorChosen) {

case 0:

gdImageFill(im, 32, 32, r);

break;

case 1:

gdImageFill(im, 32, 32, g);

break;

case 2:

gdImageFill(im, 32, 32, b);

break;

}

cgiHeaderContentType("image/gif");

gdImageGif(im, cgiOut);

gdImageDestroy(im);

return 0;

}

为调试而捕捉CGI状态

cgic函数参考

cgiFormResultType cgiFormString( char *name, char *result, int max)

用于从输入域中copy字符串。他将域名max-1字节中的字符copy到缓冲区result。若域不存在,则copy一个空串到result缓冲区。在此函数中所有的新行由换行符代表。

cgiFormResultType cgiFormStringNoNewlines( char *name, char *result, int max)

它与cgiFormString函数相似,只是所有的CR和LF都被去掉了。

cgiFormResultType cgiFormStringSpaceNeeded( char *name, int *length)

它返回指向name的字符串的长度,并将长度放入length中。

cgiFormResultType cgiFormStringMultiple( char *name, char ***ptrToStringArray)

若同一名字有多个输入域,或域中的字符串可以动态变化,那么你可以使用本函数。它把名为name的所有输入域的值放在prtToStringArray中。

void cgiStringArrayFree(char **stringArray)

它释放了分配给stringArray的内存。

cgiFormResultType cgiFormInteger( char *name, int *result, int defaultV)

从输入域中取出整数放入result中。

cgiFormResultType cgiFormIntegerBounded( char *name, int *result, int min, int max, int defaultV)

若输入域中的整数在界限内则取出并放入result中。

cgiFormResultType cgiFormDouble( char *name, double *result, double defaultV)

从输入域中取出浮点数放入result中。

cgiFormResultType cgiFormDoubleBounded( char *name, double *result, double min, double max, double defaultV)

若输入域中的浮点数在界限内则取出并放入result中。

cgiFormResultType cgiFormSelectSingle( char *name, char **choicesText, int choicesTotal, int *result, int defaultV)

取出复选框(跟在select语句之后的),把选择的名字copy到choicesText,把选择的个数copy到choicesTotal,把当前的选择copy到result。

cgiFormResultType cgiFormSelectMultiple( char *name, char **choicesText, int choicesTotal, int *result, int *invalid)

与cgiFormSelectSingle类似,只指向整型数组的result代表了选择的项。

cgiFormResultType cgiFormCheckboxSingle( char *name)

若复选框被选中,则函数返回cgiFormSuccess,否则返回cgiFormNotFound。

cgiFormResultType cgiFormCheckboxMultiple( char *name, char **valuesText, int valuesTotal, int *result, int *invalid)

与cgiFormCheckboxSingle类似,但它处理同一名字有多个复选框的情况。name指向复选框的名字;valuesText指向包含有每个复选框中参数的一个数组;valuesTotal指向复选框的总数;result是一个整型数组,每个复选框选中的用1代表,没选中的用0代表。

cgiFormResultType cgiFormRadio( char *name, char **valuesText, int valuesTotal, int *result, int defaultV)

与cgiFormCheckboxMultiple相似,只是这里是单选按钮而不是复选框。

void cgiHeaderLocation(char *redirectUrl)

重定向到redirectUrl指定的URL。

void cgiHeaderStatus(int status, char *statusMessage)

输出状态代码status和消息statusMessage。

void cgiHeaderContentType(char *mimeType)

用于告知浏览器返回的是什么类型的文档。

cgiEnvironmentResultType cgiWriteEnvironment(char *filename)

本函数把当前CGI环境写入filename文件中以便以后调试时使用

cgiEnvironmentResultType cgiReadEnvironment(char *filename)

本函数从filename文件中读取CGI环境以便用来调试。

int cgiMain()

一个程序必须要写这个函数, 这是主程序开始之处。

cgic变量参考

This section provides a reference guide to the various global variables provided by cgic for the programmer to utilize. These variables should always be used in preference to stdin, stdout, and calls to getenv() in order to ensure compatibility with the cgic CGI debugging features.

大多数的变量相当于各种CGI变量,重要的是VGIC的变量不能为空.

char *cgiServerSoftware

服务器软件名称,或者一个空的字符串 or to an empty string if unknown.

char *cgiServerName

返回服务器名称或空

char *cgiGatewayInterface

网关接口 (通常是 CGI/1.1),或空

char *cgiServERProtocol

网络协议(usually HTTP/1.0),或空

char *cgiServerPort

服务器端口(usually 80),或空

char *cgiRequestMethod

请求方式 (usually GET or POST),或空

char *cgiPathInfo

指出附加虚拟路径

char *cgiPathTranslated

指出附加虚拟路径并由服务器转为本地路径

char *cgiScriptName

调用程序的名字

char *cgiQueryString

包含 GET-method 请求或者 标签. 这个信息不需要解吸,除非用标签通常由CGIC函数库自动解析。

char *cgiRemoteHost

从浏览器返回客户主机的名字

char *cgiRemoteAddr

从浏览器返回客户的IP地址

char *cgiAuthType

返回用户授权信息

char *cgiRemoteUser

鉴别用户 cgiAuthType.

char *cgiRemoteIdent

返回用户的名字(用户通过用户坚定协议)这个消息是不安全的,特别是Windows系统。

char *cgiContentType

返回MIME内型

char *cgiAccept

参考 cgiHeaderContentType() cgiUserAgent

char *cgiUserAgent

取的用户浏览器信息

char *cgiReferrer

指向用户访问的URL.

int cgiContentLength

表单或查询数据的字节被认为是标准的.

FILE *cgiOut

CGI输出. cgiHeader函数,象cgiHeaderContentType, 首先被用于输出mime头; 用于 fprintf() 和fwrite(). cgiOut通常相当于stdout。

FILE *cgiIn

CGI输入. 在决大部分时间你都不会需要这个函数。

cgic结果编码参考

在大量的按列中, cgic函数有计划的产生合理的结果,甚至浏览器和用户不合理时。无论如何, 有时候知道不合理的事情发生,尤其赋予一个值或定义一个范围是一个不充分的解决方案。下面的这些结果编码有助更好了解。

cgiFormSuccess

提交信息成功

cgiFormTruncated

删除部分字节.

cgiFormBadType

错误的输入信息(没有按要求)

cgiFormEmpty

提交信息为空.

cgiFormNotFound

提交信息没有找到.

cgiFormConstrained

数字属于某个特定的范围,被迫低于或高于适当范围。

cgiFormNoSuchChoice

单一选择提交的值是不被接受。通常说明表但和程序之间存在矛盾。

cgiEnvironmentIO

从CGI环境或获取的文件读或写的企图失败,报出I/O的错误。

cgiEnvironmentMemory

从CGI环境或获取的文件读或写的企图失败,报出out-of-memory的错误。

cgiEnvironmentSuccess

从CGI环境或获取的文件读或写的企图成功。

cgic快速索引

cgiAccept | cgiAuthType | cgiContentLength | cgiContentType | cgiEnvironmentIO | cgiEnvironmentMemory | cgiEnvironmentSuccess | cgiFormBadType | cgiFormCheckboxMultiple() | cgiFormCheckboxSingle() | cgiFormConstrained | cgiFormDouble() | cgiFormDoubleBounded() | cgiFormEmpty | cgiFormInteger() | cgiFormIntegerBounded() | cgiFormNoSuchChoice | cgiFormNotFound | cgiFormRadio() | cgiFormSelectMultiple() | cgiFormSelectSingle() | cgiFormString() | cgiFormStringMultiple() | cgiFormStringNoNewlines() | cgiFormStringSpaceNeeded() | cgiFormSuccess | cgiFormTruncated | cgiGatewayInterface | cgiHeaderContentType() | cgiHeaderLocation() | cgiHeaderStatus() | cgiIn | cgiMain() cgiOut | cgiPathInfo | cgiPathTranslated | cgiQueryString | cgiReadEnvironment() | cgiReferrer() | cgiRemoteAddr | cgiRemoteHost | cgiRemoteIdent | cgiRemoteUser | cgiRequestMethod | cgiScriptName | cgiServerName | cgiServerPort | cgiServerProtocol | cgiServerSoftware | cgiStringArrayFree() | cgiUserAgent | cgiWriteEnvironment()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3交互模式下 按上翻箭头显示乱码_CentOS 6.3中,Python-2.7.3交互模式下方向键、退格键等出现乱码...

CentOS 6.3中&#xff0c;Python-2.7.3交互模式下方向键、退格键等出现乱码#安装readline-devel# yum install readline-devl#重新安装python1. 准备工作下载源码包如果没有安装make工具~#rpm -qa|grep makeyum -y install gcc automake autoconf libtool make安装zlibyum inst…

C#实现插入排序法

private int[] test_Insertion(int[] list) //插入排序 传入数组 3, 6, 2, 1, 9, 5, 4, 7 {for(int i 1;i<list.Length;i) //首选取出第一个数&#xff08;3&#xff09;作为一个有序的数组&#xff0c;然后遍历传入数组"3"之后的每一个数{int j ;int key list[…

c3d怎么调语言,falc3d参数调整心得

对于flac3d我是一个菜鸟级新手&#xff0c;刚接触flac3d没几天就要用来做东西&#xff0c;其中的艰辛实在不足为外人道也。不过菜鸟在前进&#xff01;随着使用的次数增多&#xff0c;对于flac的认识也增多了不少&#xff0c;虽然里精通还有十万八千里&#xff0c;但小小的心得…

nvidia驱动崩了 ubuntu_Ubuntu 16.04安装nVidia驱动失败!

Ubuntu 16.04安装nVidia驱动失败&#xff01;发布时间:2016-09-16 10:24:00来源:红联作者:sutao80216我的笔记本是I/N双显卡&#xff0c;CPU是i7&#xff0c;独显是nVidia GEFORCE GT520M&#xff0c;从Ubuntu 13版本系列开始&#xff0c;安装nVidia的独显驱动从来没有成功过&a…

sql 数字转换为16进制数函数

create function [dbo].[IntToHex](num int)returns varchar(100)asbegindeclare re varchar(100)set rewhile num>0select resubstring(0123456789ABCDEF,num%161,1)re,numnum/16return(re)end

移动端REM布局方案

引用http://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html的方案 下载地址https://github.com/hupan508/lib-flexible 注意点。 1、如果html设置过 meta &#xff0c;js将使用meta 标签的缩放。 <meta http-equiv"X-UA-Compatible" content"I…

c语言插件实现原理,C语言实现插件机制

现在越来越多的软件项目都提供插件机制&#xff0c;这样使得软件的扩展性大大增强&#xff0c;那么到底插件机制的实现是怎么样的呢&#xff1f;在这里只谈论C语言的实现&#xff0c;其实C语言实现插件的例子也很多&#xff0c;像mjpg-streamer就是将输入输出做成插件&#xff…

sql 简单加密函数

用到了之前的数字转换为16进制数函数 IntToHex create function [dbo].[IntToHex](num int)returns varchar(100)asbegindeclare re varchar(100)set rewhile num>0select resubstring(0123456789ABCDEF,num%161,1)re,numnum/16return(re)endcreate function [dbo].[GetUser…

最全面的Android Studio使用教程【申明:来源于网络】

最全面的Android Studio使用教程【申明&#xff1a;来源于网络】 http://www.admin10000.com/document/5496.html 转载于:https://www.cnblogs.com/yearHeaven/p/6741388.html

linkedhashmap 顺序_LinkedHashMap 源码详细分析(JDK1.8)

1. 概述LinkedHashMap 继承自 HashMap&#xff0c;在 HashMap 基础上&#xff0c;通过维护一条双向链表&#xff0c;解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。除此之外&#xff0c;LinkedHashMap 对访问顺序也提供了相关支持。在一些场景下&#xff0c;该特性…

testNG入门详解

TestNG 的注释: DataProvider ExpectedExceptions Factory Test Parameters <suite name"ParametersTest"><test name"Regression1"><classes><class name"com.example.ParameterSample" /><class name"com.exa…

尼康相机报错err_数码相机遇到这12种错误,自己动手就能解决,再不用找人维修...

如果您资深摄影师或者专业摄影爱好者&#xff0c;那么您必须熟悉下面提到的数码相机所出现的问题和错误。如果您没有遇到任何问题&#xff0c;要么您是初学者&#xff0c;要么您已经很少拍摄了。下面列出的常见相机问题及其解决方案&#xff0c;会为您在使用数码相机的过程中提…

c语言 申请1k内存,怎么解决函数内申请内存,函数外释放的问题

由于不同的编译器和库&#xff0c;其内部关于内存申请释放的实现不同&#xff0c;因此不能直接要求用户指定用某个函数释放内存&#xff0c;必须要单独自己封装一个释放的接口。有两种思路&#xff1a;一是以指针作为参数得到数组地址&#xff0c;单独设计一个释放的函数&#…

SQL Server CLR 启用、部署

sqlserver启用CLRexec sp_configure clr enabled,1 --1,启用clr 0,禁用clrRECONFIGURESQL Server CLR 部署到某个数据库后&#xff0c;便成为那个数据库的一部分&#xff0c;即便备份及还原到其它机器上&#xff0c;它依然具有CLR带来的功能。SqlString 数据类型转换成 nvarcha…

mysql 慢查询过多_MySQL 慢查询优化

为什么查询速度会慢1.慢是指一个查询的响应时间长。一个查询的过程&#xff1a;客户端发送一条查询给服务器服务器端先检查查询缓存&#xff0c;如果命中了缓存&#xff0c;则立可返回存储在缓存中的结果。否则进入下一个阶段服务器端进行SQL解析、预处理&#xff0c;再由优化器…

sqlserver获得到当前游标中存在的数据行数

Select CURSOR_ROWS 可以得到当前游标中存在的数据行数。 注意&#xff1a;此变量为一个连接上的全局变量&#xff0c;因此只对应最后一次打开的游标。

android beta项目官方页面,安卓7.0开发者预览版如何安装?Android Beta项目正式上线...

谷歌现在越来越不按常理出牌了&#xff0c;今天早些时候&#xff0c;他们已经提前秀出了Android 7.0。从最新亮相的Android N开发者预览版来看&#xff0c;谷歌进行了一些调整&#xff0c;但更重要的是&#xff0c;增加了一些新的功能&#xff0c;比如分屏、新的通知控制等。那…

iOS-模糊查询

http://blog.csdn.net/qq_33701006/article/details/51836914 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[] 前言: 为了巩固FMDB,就来找个简单的Demo学习一下。不好找工作啊&#xff0c;就学习吧&#xff0c;没应聘的消遣吧。 简单介…