嵌入式Web项目(二)——CGI的引入


静态网页工作原理

在这里插入图片描述

这里以上一节博客中案例test_01.html文件为例。(类比图中的a.html)
浏览器通过访问我的TCP服务器(Web服务器,boa),请求获得test01_html文件的信息。
服务器(boa)在接收到这个请求以后,就会去解析该请求在我们对应的资源目录文件中去寻找请求文件

在这里插入图片描述
改资源目录是由上一届中对boa进行配置的文件路径。
在这里插入图片描述
服务器找到对应的文件以后,便打开此请求文件,读取此文件中的数据,将该信息与响应头(响应头指的是对请求文件的响应信息,后面会详细介绍)合并。然后返回发送给用户浏览器

动态网页工作原理

所谓动态网页,指的是网页上的数据在不断的进行更新的一个概念,区别于静态网页一层不变的概念。
比如我们要采集光照强度和温度的数据,显然这个数据是随着时间在不断变化的一个过程,因此为了实现这样的一个数据不断更新的功能,引入了动态网页的技术。

其难点,就在如何让服务器知道用户请求的是一个静态网页(固定的内容的文本文件),还是一个动态网页(由某个程序代码来产生了需要的文本文件)

因此,我们引入了CGI

CGI的概念

在这里插入图片描述
CGI(Common Gateway Interface,公共网关接口)是Web服务器运行时外部程序的规范,按CGI编写的程序可以扩展服务器功能。CGI应用程序能与浏览器交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放入到数据库中。

CGI工作原理

在这里插入图片描述

如上图,其本质就是在两道程序中,充当了一个中间者的角色。因为我们的数据产生本身是一个进程,我们的服务器也是一个进程。所以,如果直接将数据发送给我们的服务器,显然就得解决两者的进程间通信的问题。,而有了CGI以后,我们只需要按照CGI的标准来写程序,就能将数据以动态的形式由服务器发送给用户浏览器。

boa配置静态文件与CGI文件访问路径

静态文件

在这里插入图片描述这是我们上一节博客配置的资源路径。这里为了方便我们区分,我们将此路径进行更改
在这里插入图片描述

CGIPath

在这里插入图片描述CGIPath指的时CGI运行时的环境变量,其目的是告诉服务器,CGI程序的运行路径。

动态网页

在这里插入图片描述

这里就是我们今天需要进行修改的地方,其中/cgi-bin/ 指的就是当我们访问的文件带有cgi-bin字段的时候,就表示访问的动态网页信息,因此我们的服务器,就会从后面的路径/usr/lib/cgi-bin/下去找此文件

修改如下
在这里插入图片描述

新的资源目录结构如下
在这里插入图片描述
测试一下,以test_01.html文件为例。配置完后需要要重启下服务器
在这里插入图片描述
成功

以shell语言,实现动态网页案例

我们编写一个时间的shell脚本,放入到cgi目录下
在这里插入图片描述修改time的权限
chmod 777 time

执行
在这里插入图片描述

第一次访问测试

在这里插入图片描述
修改源代码
出错原因这与http协议要求有关。http协议要求,响应的数据格式为
在这里插入图片描述
状态行,由boa服务器替我们添加上,但是消息报头和空行是需要我们自己补上的。至于为什么非要按这个要求来,我猜测与网络安全有关

修改如下
在这里插入图片描述

第二次测试

在这里插入图片描述
成功

C语言测试

编写测试程序和Makefile

创建一个工作目录
在这里插入图片描述
test_time.c

#include<stdio.h>
#include"time.h"
int main(){
    char *head_title="C语言测试";
    printf("Content-Type:text/html;charset=utf-8\r\n");
    printf("\r\n");
    printf("<h1>%s</h1>",head_title);
    printf("<h2>%s</h2>",get_time(0));
        return 0;
}

time.h

#ifndef TIME_H
#define TIME_H
#include<time.h>
extern char* get_time(time_t now);

#endif

time.c

#include<stdio.h>
#include"time.h"
#include<string.h>
#include<stdlib.h>
char* get_time(time_t now){
    struct tm *local;
    static char res[16]={0};//存储时间
    if(now<0){
        time(NULL);
    }else{
                time(&now);
        }
    local=localtime(&now);
    if(local==NULL){
        perror("获取时间错误");
                exit(-1);
    }
    snprintf(res,sizeof(res),"%02d:%02d:%02d",local->tm_hour,local->tm_min,local->tm_sec);
    return res;

}

Makefile

TARGET := time

OBJ :=time.o
OBJ +=test_time.o

CROSS_COMPILE :=
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
CFLAGS := -Wall -I ../inc
LDFALGS :=

OUTPUT_DIR :=/home/jacky/www/cgi

all:$(TARGET)
$(TARGET):$(OBJ)
        $(CC) $(LDFALGS) -o $@ $^
        mv $(TARGET) $(OUTPUT_DIR)
%.o:%.c
        $(CC) $(CFLAGS) -c -o $@ $^
.PHONY clean:
        rm -rf $(OBJ) $(TARGET)

执行make
在这里插入图片描述

测试浏览器

在这里插入图片描述
在这里插入图片描述

成功

  • 1
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacky~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值