news 2026/3/16 16:09:35

CGI及CGIC库的使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CGI及CGIC库的使用

CGI

  • 作为标记语言html是无法读取硬件信息的,但C语言可以实现一个html页面
  • 传感器数据的数据是动态变化的,html页面是静止的,可以让浏览器每一秒刷新一次页面,但是浪费资源且体验效果一般

关于CGI

  • CGI全称为 Common Gateway Interface,是一种标准协议,定义了Web服务器与外部应用程序(通常是执行脚本或程序)之间的交互方式
  • 主要作用是在Web服务器和生成动态内容的应用程序之间传递信息
  • 当用户在Web浏览器中请求一个CGI程序时,Web服务器会将请求传递给相应的CGI脚本。脚本执行完成后,将结果返回给服务器,服务器再将结果传给用户的浏览器

  • CGI脚本可以用多种编程语言编写,如Perl、Python、C、或者Shell脚本

CGI的特点:

  • 对http浏览器来说,cgi脚本文件只是一个页面文件
  • CGI可以使用任意编程语言编写,只要这个语言能把数据输出到标准输出即可
  • CGI是一个标准,它规定了系统所必须具备的环境变量

CGI相关文档

CGI标准官方文档:

RFC 3875 - The Common Gateway Interface (CGI) Version 1.1 (ietf.org)

CGI教程:

C++ Web 编程 | 菜鸟教程 (runoob.com)

Python CGI 编程 | 菜鸟教程 (runoob.com)

Perl CGI编程 | 菜鸟教程 (runoob.com)

CGI环境变量

变量名描述
CONTENT_TYPE内容的数据类型。当客户端向服务器发送附加内容时使用。例如,文件上传等功能。
CONTENT_LENGTH查询的信息长度。只对 POST 请求可用。
HTTP_COOKIE以键 & 值对的形式返回设置的 cookies。
HTTP_USER_AGENT用户代理请求标头字段,递交用户发起请求的有关信息,包含了浏览器的名称、版本和其他平台性的附加信息。
PATH_INFOCGI 脚本的路径。
QUERY_STRING通过 GET 方法发送请求时的 URL 编码信息,包含 URL 中问号后面的参数。
REMOTE_ADDR发出请求的远程主机的 IP 地址。这在日志记录和认证时是非常有用的。
REMOTE_HOST发出请求的主机的完全限定名称。如果此信息不可用,则可以用 REMOTE_ADDR 来获取 IP 地址。
REQUEST_METHOD用于发出请求的方法。最常见的方法是 GET 和 POST。
SCRIPT_FILENAMECGI 脚本的完整路径。
SCRIPT_NAMECGI 脚本的名称。
SERVER_NAME服务器的主机名或 IP 地址。
SERVER_SOFTWARE服务器上运行的软件的名称和版本。

HTTP请求与CGI脚本的交互过程

  • CGI的交互过程依赖于环境变量和标准输入输出,允许服务器动态生成内容处理复杂的用户请求

  1. 客户端发起请求
    • 用户在浏览器中请求一个URL,这个URL指向一个CGI脚本
    • 该请求可以是GET请求或POST请求
  2. 服务器接收到请求
    • Web服务器(如Apache或Nginx)接收到HTTP请求后会检查请求的URL
    • 如果URL对应于CGI脚本的路径,服务器将识别需要启动CGI处理
  3. 调度CGI脚本
    • 服务器根据请求启动相应的CGI脚本作为新进程运行
    • 在启动脚本前,服务器设定环境变量,这些变量包含了请求的各种信息
  4. 传递请求数据
    • 环境变量:服务器通过环境变量传递请求的元数据,如请求方法、查询字符串、内容类型等。例如:
      • REQUEST_METHOD: 请求方式(如GET、POST)
      • QUERY_STRING: URL中的查询字符串
      • CONTENT_TYPE: 请求体的数据类型(针对POST请求)
    • 标准输入(stdin):对于POST请求,请求体的数据通过标准输入传递给CGI脚本。
  5. CGI脚本处理请求
    • CGI脚本读取请求数据和环境变量,并进行相应的数据处理和逻辑操作。
    • 脚本生成输出,包括HTTP头部和内容。常见的首个输出头是Content-Type,告知响应数据的类型,例如Content-Type: text/html
  6. 返回响应给服务器
    • 脚本执行完成后,将输出发送回Web服务器
    • Web服务器将这一输出作为HTTP响应发送回客户端浏览器
  7. 浏览器显示内容
    • 客户端浏览器接收到响应后,解析并渲染网页内容供用户查看

CGI接口的引入

  • CGI脚本可以用多种编程语言编写,如Perl、Python、C、或者Shell脚本
#include<stdio.h>intmain(intargc,char*argv[]){printf("Content-Type: text/html\n\n");printf("<!DOCTYPE html>\n");printf("<html> <head> <meta charset=\"utf-8\">\n");printf("<title>我的html页面</title> </head> <body>\n");printf("<h1>第一个标题</h1>\n");printf("<p>我的第一个段落。</p>\n");printf("</body> </html> \n");return0;}
  • 将以上代码编译后的输出文件改为test.cgi放于/usr/lib/cgi-bin/目录下
#!/bin/bashecho"Content-Type: text/html"echo""echo"<!DOCTYPE html>"echo"<html> <head> <meta charset=\"utf-8\">"echo"<title>html页面</title> </head> <body>"echo"<h1>标题</h1>"echo"<p>我的第一个段落</p>"echo"</body> </html>"
  • 或将以上shell脚本改为test.cgi放于/usr/lib/cgi-bin/目录下
  • 运行前需要让http服务器支持CGI功能:
sudoa2enmod cgisudosystemctl restart apache2
  • 浏览器访问:ip/cgi-bin/test.cgi

.cgi是为了表示这是个CGI程序,和其它可执行程序是一样的,没有特殊的属性,去掉.cgi的后缀不影响其功能

CGI程序处理form表单

  • html只是静态页面,无法动态的处理这种问题。需要依靠其它具备逻辑控制能力的语言来完这项工作

form表单

<formaction="/cgi-bin/login.cgi"method="get"><inputtype="text"name="username"placeholder="请输入用户名"><br><inputtype="password"name="password"placeholder="请输入密码"><br><inputtype="submit"value="Login"></form>
  • action="/cgi-bin/login.cgi": 这个属性指定了当用户提交表单时,表单数据将被发送到服务器上的/cgi-bin/login.cgi文件进行处理
  • method="get": 这个属性指定了表单数据的提交方式
  • type="submit": 定义了一个提交按钮,当用户点击这个按钮时,表单数据将被发送到服务器

CGI处理程序

#include<stdio.h>#include<stdlib.h>intmain(void){char*data=getenv("QUERY_STRING");charusername[50],password[50];//%49[^&]:表示从当前位置读取最多 49 个字符,直到遇到 &sscanf(data,"username=%49[^&]&password=%49s",username,password);//由于告诉浏览器,将发送html的文本页面printf("Content-Type: text/html\n\n");//登录成功以后的显示内容printf("<h1>Login successful! Welcome, %s!</h1>",username);return0;}
  • 同样:将编译好的应用程序改为xxx.cgi复制到/usr/lib/cgi-bin/目录下

CGIC库

关于CGIC库

  • CGIC 是一个用于开发 CGI(Common Gateway Interface)程序的 C 库,CGIC 库简化了 CGI 程序的开发,处理诸如表单数据解析和环境变量管理等常见任务
  • 以下是一些 CGIC 库的功能和特点:
  1. GET 和 POST 解析:CGIC 可以自动解析从客户端发送的 GET 和 POST 请求数据,并将数据存储为键值对,方便开发者获取和使用。
  2. 文件上传:支持处理多部分表单数据(multipart/form-data),使处理文件上传更为轻松
  3. 错误处理:提供了一些机制来处理输入数据可能引起的错误,比如数据缺失或格式错误
  4. 简化环境变量管理:CGIC 提供了一些函数来获取常用的 CGI 环境变量,如CONTENT_TYPEREQUEST_METHODQUERY_STRING
  5. 跨平台支持:CGIC 是用标准 C 语言编写的,能够在多种操作系统上使用,如 Unix/Linux 和 Windows

CGIC库的下载:

https://github.com/boutell/cgic

构建CGIC应用程序

准备源码

#include<stdio.h>#include<string.h>#include<stdlib.h>#include"cgic.h"intcgiMain(){// 输出 HTTP 响应头cgiHeaderContentType("text/html");// 输出 HTML 头部fprintf(cgiOut,"<!DOCTYPE html>\n");fprintf(cgiOut,"<html>\n<head>\n<meta charset=\"utf-8\">\n");fprintf(cgiOut,"<title>我的html页面</title>\n</head>\n<body>\n");Tcharusername[50];charpassword[50];// 获取表单数据if(cgiFormString("username",username,sizeof(username))!=cgiFormSuccess){strcpy(username,"未知用户");}if(cgiFormString("password",password,sizeof(password))!=cgiFormSuccess){strcpy(password,"未知密码");}fprintf(cgiOut,"<h1>登录成功,欢迎 %s!</h1>\n",username);// 输出 HTML 结束标签fprintf(cgiOut,"</body>\n</html>\n");return0;}

修改cgic库的Makefile或替换cgitest.c文件

  • 以下是添加了注释的Makefile文件内容:
# 编译选项,使用 -g 进行调试信息生成,-Wall 打开所有警告信息 CFLAGS=-g -Wall # 指定 C 编译器 CC=gcc # 指定创建静态库的工具 AR=ar # 指定静态库索引工具 RANLIB=ranlib # 指定链接器选项,这里找到当前目录下的库,链接 cgic 库 LIBS=-L./ -lcgic # 默认目标。生成 libcgic.a 静态库、cgictest.cgi 可执行文件和 capture 可执行文件 all: libcgic.a cgictest.cgi capture # 安装目标。将 libcgic.a 复制到 /usr/local/lib,将 cgic.h 复制到 /usr/local/include install: libcgic.a cp libcgic.a /usr/local/lib cp cgic.h /usr/local/include @echo libcgic.a is in /usr/local/lib. cgic.h is in /usr/local/include. # 静态库目标。生成 cgic.o 对象文件并创建 libcgic.a 静态库 libcgic.a: cgic.o cgic.h rm -f libcgic.a $(AR) rc libcgic.a cgic.o $(RANLIB) libcgic.a # 适用于 mingw32 和 cygwin 用户,将生成的可执行文件更改为 .exe 扩展名 # 可执行文件目标 cgictest.cgi,确保链接 libcgic.a 静态库 cgictest.cgi: cgictest.o libcgic.a gcc cgictest.o -o cgictest.cgi ${LIBS} # 可执行文件目标 capture,确保链接 libcgic.a 静态库 capture: capture.o libcgic.a gcc capture.o -o capture ${LIBS} # 清理目标。删除所有生成的对象文件、静态库和可执行文件 clean: rm -f *.o *.a cgictest.cgi capture cgicunittest # 测试目标。编译并运行单元测试程序 test: gcc -D UNIT_TEST=1 cgic.c -o cgicunittest ./cgicunittest

CGI存在的问题与解决方案

  • CGI(Common Gateway Interface)在Web开发中曾经是一种常用的技术,但随着现代Web开发技术的进步,它的一些问题也逐渐显露出来。以下是CGI存在的一些主要问题及其解决方案:
  1. 性能问题
    • 问题:CGI每次处理请求时都会启动一个新的进程,这对于服务器来说开销非常大,尤其是在高并发环境下,容易导致性能下降。
    • 解决方案:使用持久连接技术,如FastCGISCGI,这些技术通过重用进程来处理多个请求,从而提高性能。
  2. 安全问题
    • 问题:不安全的CGI脚本可能导致安全漏洞,比如缓冲区溢出和代码注入。
    • 解决方案:编写安全的脚本,进行输入验证和参数化查询;使用现代Web框架,这些框架通常提供了更多内置的安全功能。
  3. 可扩展性问题
    • 问题:由于CGI的性能限制,在大规模应用中难以扩展。
    • 解决方案:使用更现代的Web应用架构,如采用反向代理、负载均衡,并结合使用Web应用服务器如Node.js、Django、Flask等。
  4. 维护性和开发效率问题
    • 问题:CGI脚本通常直接用C或者Perl编写,代码复杂且不易维护。
    • 解决方案:采用现代编程语言和框架,如Python的Flask、JavaSpring等,它们提供了更高的开发效率和可维护性。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 13:31:45

XFCN兴飞 PZ254V-11-03P 2.54 排针

附注: 电压额定值:250V交流/直流当前评级:3.0AAC/DC 介电强度耐受电压:500VAC/分钟接触电压:最大20M2。绝缘电压:最小1000兆伏 工作温度:-40C至105C绝缘材料:聚酯。UL94V-0 接触材料:黄铜: 接触镀层:整体镍基Au或Sn镀层

作者头像 李华
网站建设 2026/3/7 0:48:32

玩转IoTDB文件体系:核心工具与数据目录、TsFile全维度查看实战

IoTDB作为专为时序数据设计的高性能数据库&#xff0c;其底层以TsFile为核心的文件体系是保障数据存储、读写性能的关键&#xff0c;而数据目录的合理管理、各类核心文件的精准查看则是日常运维、问题排查、性能调优的基础能力。 本文将从IoTDB文件体系底层逻辑出发&#xff0…

作者头像 李华
网站建设 2026/3/14 15:10:41

Gemma 3 270M:专为超高效AI设计的紧凑模型

介绍 Gemma 3 270M&#xff1a;用于超高效AI的紧凑模型 过去几个月对于Gemma系列开源模型来说是一段激动人心的时期。先是推出了Gemma 3和Gemma 3 QAT&#xff0c;为单个云和桌面加速器提供了最先进的性能。随后&#xff0c;又宣布了Gemma 3n的全面发布&#xff0c;这是一种移…

作者头像 李华
网站建设 2026/3/12 22:17:24

计算机毕业设计|基于springboot + vue家政服务平台系统(源码+数据库+文档)

家政服务平台 目录 基于springboot vue家政服务平台系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue家政服务平台系统 一、前言 博主介绍&…

作者头像 李华
网站建设 2026/3/14 8:07:26

四通道32孔生物源性检测仪

问&#xff1a;这款四通道32孔生物源性检测仪&#xff0c;核心能解决什么检测问题&#xff1f; 答&#xff1a;核心就是帮大家“辨真伪、保靠谱”&#xff0c;精准检测肉类及肉源性样品中的动物源性成分&#xff01;它支持同步检测猪、牛、羊、鸡、鸭、马等多种动物源性成分&a…

作者头像 李华
网站建设 2026/3/14 8:57:03

2026年最新:Kimi智能助手下载安装全攻略(详细步骤+常见问题解读)

前言 在人工智能工具快速普及的2026年&#xff0c;提升个人与团队工作效率已经成为技术人关注的核心议题。无论是开发、写作、学习&#xff0c;还是解决信息检索难题&#xff0c;一款稳定、易用、智能的助手类工具都能发挥巨大的价值。本文将为你带来Kimi智能助手下载安装的完…

作者头像 李华