当前位置: 首页 > 工具软件 > thttpd > 使用案例 >

thttpd交叉编译(arm) + cgi运行

钱嘉致
2023-12-01

thttpd交叉编译(arm) + cgi运行

概况

工作中遇到的需求。

物联网设备很多硬件配置都不高。相对来说。。

设备需要一个管理设备数据、控制设备的入口。这时候需要一个可配置的页面。例如:路由器、串口服务器、PDU等。

方案采取thttpd作为web服务器,接口使用cgi进行开发。简介明了,占用资源少。

thttpd交叉编译

官网:http://acme.com/software/thttpd/

​ thttpd 是一个简单、小巧、便携、快速且安全的 HTTP 服务器。

  • 简单的:

    它只处理实现 HTTP/1.1 所需的最低限度。好吧,也许比最低限度多一点。

  • 小的:

    参见 对比图 它还具有非常小的运行时大小,因为它不会分叉和对内存分配非常小心。

  • 便携的:

    它可以在大多数任何类 Unix 操作系统上干净地编译,特别包括FreeBSD、SunOS 4、Solaris 2、BSD/OS、Linux、OSF。

  • 快速地:

    在典型使用中,它与最好的全功能服务器一样快Apache、NCSA、网景)。在极端负载下它要快得多。

  • 安全的:

    它不遗余力地保护网络服务器机器免受 来自其他站点的攻击和入侵。

它还有一个非常有用的功能( 基于 URL 流量的限制 )目前没有其他服务器。另外,它支持 IPv6 开箱即用,无需修补。

编译

tar -zxvf thttpd-2.29.tar.gz
cd thttpd-2.29/
./configure CC=arm-linux-gcc --host=arm-linux --prefix=/home/pnc120432be01/Desktop/liyuworkspace/arm/thttpd
make
make install

移植

编译出来的可执行文件thttpd直接拷贝到arm机器上

运行参数配置–两种方法

关于配置的建议:

1.thttpd.conf可以配置thttpd的运行参数

port=80
user=www
host=0.0.0.0
logfile=/usr/local/thttpd/logs/thttpd.log
pidfile=/usr/local/thttpd/logs/thttpd.pid
#throttles=/usr/local/thttpd/etc/throttle.conf
#urlpat=*.txt|*.mp3
#charset=utf-8
dir=/usr/www
cgipat=/usr/local/thttpd/www/cgi-bin/

带着配置文件运行即可

thttpd -D -C /etc/thttpd.conf &

2.可以直接执行thttpd时配置(推荐这个,直接写个shell)

./thttpd -d /home/freeproject/liyu/web -u root -p 80 -c "cgi/**.cgi" -T utf-8

此时就可以在浏览器打开页面了

编写cgi

交叉编译cgi。

我使用的cJSON库,返回数据都是JSON数据,可以直接被网页处理。

样例代码:

/*
 * Copyright (c), 2022, liyu,  All rights reserved. 
 * 
 * @FilePath: /pthread/home/freeproject/liyu/code/cgi/testcgi/test.c
 * @brief: 	
 * 
 * @author: 	liyu
 * @version: 	0.0.0.1
 * @Date: 2022-04-05 01:37:53
 * @email: 	liyu19981212@outlook.com
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "../pub/cgic.h"
#include "../pub/cJSON.h"



int32_t cgiMain()
{
	
	int32_t ret;
	char *buff;
	cJSON *cgi_verification;
	cJSON *root;

    cgiHeaderContentType("text/html");
	cgi_verification = cJSON_CreateObject();
    if (NULL == cgi_verification) {
        return -1;
    } else {
	    cJSON_AddNumberToObject(cgi_verification, "state", 0);
        cJSON_AddStringToObject(cgi_verification,"msgstr","");
    }

	root = cJSON_CreateObject();
	cJSON_AddStringToObject(root,"name","liyu");
	cJSON_AddNumberToObject(root,"age",23);

   	cJSON_AddItemToObject(cgi_verification,"data",root);
    buff = cJSON_PrintUnformatted(cgi_verification);
    printf("%s", buff);
    free(buff);

	cJSON_Delete(cgi_verification);
	return 0;
}

交叉编译该文件

arm-linux-gcc test.c  cgic.c cJSON.c  -o test.cgi

运行cgi

将文件放到配置的cgi目录中

给予可执行权限

chmod 755 test.cgi

页面获取数据:

{
	"state": 0,
	"msgstr": "",
	"data": {
		"name": "liyu",
		"age": 23
	}
}
 类似资料: