thttpd嵌入式www服务工具的使用

2023-11-15

thttpd是一个非常小巧的轻量级web server,它非常简单,仅仅提供了HTTP/1.1和简单的CGI支持,在其官方网站上有一个与其他web server(如Apache, Zeus等)的对比图+Benchmark,可以参考。此外,thttpd 也类似于lighttpd,对于并发请求不使用fork()来派生子进程处理,而是采用多路复用(Multiplex)技术来实现。因此效能很好。

1 编写 web 配置文件 thttpd.conf

主要设置:
dir - www内容的目录
logfile - 日志文件
port - 访问端口
charset - 网页字符集
cgipat - cgi程序访问的url匹配模式

vi /etc/thttpd.conf
# This section overrides defaults
dir=/usr/local/thttpd/www
#chroot
user=root
# default = nobody
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
port=80
charset=utf-8
cgipat=/cgi-bin/*
# This section _documents_ defaults in effect
# nosymlink# default = !chroot
# novhost
# nocgipat
# nothrottles
# host=0.0.0.0

2 启动 thttpd

启动脚本 start.sh

#!/bin/sh
thttpd -D -C /etc/thttpd.conf &

停止脚本 thttpd

stop.sh
#!/bin/sh
pkill -9 thttpd

3 开发 cgi 程序

例:生成 cgi程序 test
以下样例,分别实现一个 post 访问,和一个 get 访问。

3.1 post 和 get 的区别

  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址可以被Bookmark,而POST不可以。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中。
  • 有些浏览器对 URL长度有限制,例如IE限制2083字节,那么get方式传递参数不能太长,POST则不受此限制。
  • get请求,在服务端使用 QUERY_STRING 变量取出参数,而post请求使用 gets() 函数取出参数。

3.2 源码 test.c 样例

#include <stdlib.h>

int main(int argc, char *argv[])
{
    char szStr[512];
    char *p ;
    strcpy(szStr, "");
    printf("Content-type:text/html\n\n");
    printf("<html>\n");
    printf("<head><title>An html page from a cgi</title></head>\n");
    printf("<body>\n");
    printf("<h1>Board.Info</h1>\n");
    
    p = getenv("QUERY_STRING");
    if(p) {
        sprintf(szStr, "get: %s",getenv("QUERY_STRING")); //打印get获取的信息
        printf("%s", szStr);
    }
    else
    {
        gets(szStr);
        if(strcmp(szStr,"")!=0)
            printf("post: %s",szStr); //打印post获取的信息
    }
    printf("</body>\n");
    printf("</html>\n");
    fflush(stdout);
    return 0;
}

3.3 交叉编译

arm-linux-gnueabihf-gcc test.c -o test

将生成的 cgi 程序test发布到www web目录下。

4 准备 web 目录

/usr/local/thttpd/www
结构:

root@am335x:/usr/local/thttpd/www# ls -lh
drwxr-xr-x    2 root     root         224 Jan 12 14:13 cgi-bin
-rw-r--r--    1 root     root         829 Jan 12 14:07 index.html

root@am335x:/usr/local/thttpd/www# ls -lh cgi-bin/
-rwxr-xr-x    1 root     root       11.8K Jan 12 14:13 test

index.html 样例:

<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>HPD Home Page</title>
</head>
<body>
    <h1>Hello HPD Visitor!</h1>
    <p>We are coming from one world, welcome here!</p>
    <form id="formpost" name="formpost" method="post" action="cgi-bin/test"> <!-- 这里调用 cgi 程序 test -->
        <p>输入内容:
            <input type="text" name="user" id="user" />
        </p>
        <p>
            <input type="submit" name="submit post" id="submitpost" value="提交" />
        </p>
    </form>
    <form id="formget" name="formget" method="get" action="cgi-bin/test"> 
        <p>输入内容:
             <input type="text" name="email" id="email" />
        </p>
        <p>
             <input type="submit" name="submit get" id="submitget" value="提交" />
        </p>
    <form>
</body>
</html>

访问

浏览器打开服务器:
页面样例,点击提交分别是提交 post 和 get
POST 提交,页面显示收到的参数:

post: user=demo+post&submit+post=%E6%8F%90%E4%BA%A4

GET 提交,页面显示收到的参数:

get: email=demo+get&submit+get=%E6%8F%90%E4%BA%A4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

thttpd嵌入式www服务工具的使用 的相关文章

随机推荐

  • 用chatgpt写论文可行吗,查重率会达到多少

    AI工具国内体验 关注 码视野 回复关键字 1002 选题 题目 物联网技术在智能家居系统中的应用研究 概要生成 问 请以 物联网技术在智能家居系统中的应用研究 为课题 写一篇物联网专业本科毕业论文的摘要 不少于400字 答 随着人们生活水
  • 单内核与微内核

    单内核是个很大的进程 它的内部又能够被分为若干模块 或是层次或其他 但是在运行的时候 他是个单独的二进制大映象 其模块间的通讯是通过直接调用其他模块中的函数实现的 而不是消息传递 在运行效率上 单内核会具有一定的好处 单内核结构是非常有吸引
  • 前端将后端返回的文件流转为excel并下载

    1 目的 将文件流转为excel并进行下载 下面图片是发请求之后 后端返回的文件流 想要实现的效果是将文件流转为excel并进行下载 2 实现步骤 2 1 utils exportFile js export function export
  • npm 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

    npm 无法将 npm 项识别为 cmdlet 函数 脚本文件或可运行程序的名称 请检查名称的拼写 如果包括路径 请确保路径正确 然后再试一次 目录 一 报错 二 解决 1 安装node js node js安装过程中的报错问题 解决nod
  • ThinkPHP5多语言切换项目实战

    ThinkPHP5多语言切换实战 1 在配置文件中开启多语言配置 2 然后添加多语言目录 这里创建你需要的语言包 在语言包里定义需要翻译的文本 中英文数组的键名写成一致 然后在html文件里输入 lang 键名 对应的键名 就是下图的写法
  • unity shader加载序列帧图片

    先设置序列帧图WarpMode 为Repeat Shader部分 Shader My Sequence Properties Opacity 透明度 range 0 1 0 5 Sequence 序列帧 2d gray RowCount 行
  • global clk 的 skew & jitter

    ku040 的 skew 同一个 clk 下的不同寄存器 clk 到达时间可能会差 300ps 跟 clk 走线的长度相关 一般同一个 bank内 clk 在 30ps 之内 但是不同的 clk 即使从同一个 mmcm pll 的不同管脚发
  • 【C语言的栈溢出问题以及部分解决】

    C语言的栈溢出问题 例如 针对学习过程中遇到的栈溢出问题 C语言的栈溢出问题 前言 栈溢出 Stack overflow 导致栈溢出的原因 函数递归层次太深 1 修改栈区空间大小 2 尾部递归优化 附一 设置优化选项 O1 O2 附二 解决
  • idea中 mybatis 的 mapper.xml 新建没有 头文件

    idea中 mybatis 的 mapper xml 新建没有 头文件 解决步骤 1 直接 settings 2 直接 选择 MybatisMapper 添加
  • C6678多核DSP开发——image_processing例程

    前言 这篇学习笔记记录了在DSP上实现简单图像处理算法的image processing例程 该例程在CCS安装时安装在目录下 主要实现了对图像的分割 灰度处理以及边缘检测 学会了调用和修改DSP例程以及图像处理基本程序框架 1 打开CCS
  • iOS 的 APP 在系统中如何适应 iPhone 5s/6/6 Plus 三种屏幕的尺寸?

    iOS 的 APP 在系统中如何适应 iPhone 5s 6 6 Plus 三种屏幕的尺寸 iOS开发如何标准化的适应新的iPhone 5s iPhone6 6 Plus 是否有一种一劳永逸的解决方法 而不需要设计师针对不同的尺寸单独进行设
  • 基础算法题——炎炎消防队(取巧、三分)

    炎炎夏日 题目描述 夏天的重庆格外地炎热 很容易起火 消防士们都全副武装 一旦发生险情就立马赶往救火 森罗是消防队中的一员 他在灭火的过程中突发奇想 如果能用退火的原理求解函数求最小值 那不就可以很容易计算了吗 翌日 森罗来到即将高考的弟弟
  • Android中如何重新启动应用APP或重启系统

    重新启动应 程序 有两种 法 分别是 1 通过ActivityManager来重新启动应 程序 java 代码 ActivityManager manager ActivityManager this getSystemService Co
  • pm grant 命令

    CustomLocale apk所需要的权限 android permission CHANGE CONFIGURATION 自Android 4 2 4 2 2起系统定义为android protectionLevel signature
  • java学习笔记——众筹项目练习——前台系统的实名认证功能、ajax发送跨域请求、后台manager系统的实名认证人工审核

    实名认证功能 前面的文章中我们实现了后台manager系统中的流程管理功能 并且将实名认证的流程上传到了服务器并完成部署 不过 仅仅是长传和部署当然不是我们的目的啦 我们上传这个实名认证流程时为了可以让前台的广大用户可以使用这个流程 怎么才
  • C++ Primer 第五章 Statements

    C Primer 第五章 Statements 5 3 Conditional Statements 5 3 2 The switch Statement 5 4 Iterative Statements 5 4 3 Range for S
  • VScode 运行java出现exited with code=1 in 0.695 seconds的问题解决

    在运行vs中Java代码时 配置过程中可能会出现一些问题 导致运行结果为上述所示 在vs中运行Java代码时 首先要确保Java环境配置无误 出现下面的则证明配置成功 之后需要安装几个插件 最后就可以在vs中编写Java代码了
  • 使用C++调用C#的DLL

    SwfDotNet是C 编写的 作者的C 水平 真是令我佩服 这是个特别好的读写Swf文件的库 但是 我要用在C 项目中 怎么让C 调用C 的DLL呢 今天一上午都在琢磨这个问题 耽误了很多时间 原因是编译是出现 warning C4819
  • LeetCode题目笔记——389. 找不同/Python/C++

    文章目录 题目描述 题目难度 简单 方法一 使用哈希表计数出现次数 代码 Python 方法二 利用字母的ASCII码 代码 C Python 方法三 位运算 总结 题目描述 给定两个字符串 s 和 t 它们只包含小写字母 字符串 t 由字
  • thttpd嵌入式www服务工具的使用

    thttpd是一个非常小巧的轻量级web server 它非常简单 仅仅提供了HTTP 1 1和简单的CGI支持 在其官方网站上有一个与其他web server 如Apache Zeus等 的对比图 Benchmark 可以参考 此外 th