WhyCan Forum

人过留名,雁过留声,感谢各位朋友不离不弃地支持。 QQ: 516333132 (挖坑网/填坑网) admin@whycan.cn

您尚未登录。

#1 2019-09-21 10:44:30

歌以咏志
会员
注册时间: 2019-09-21
累计积分: 25

潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

1. 修改 package/busybox/busybox.config

关于http部分改成这样:

CONFIG_HTTPD=y
# CONFIG_FEATURE_HTTPD_RANGES is not set
# CONFIG_FEATURE_HTTPD_SETUID is not set
CONFIG_FEATURE_HTTPD_BASIC_AUTH=y
CONFIG_FEATURE_HTTPD_AUTH_MD5=y
CONFIG_FEATURE_HTTPD_CGI=y
CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR=y
CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y
CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y
CONFIG_FEATURE_HTTPD_ERROR_PAGES=y

2. 在 buildroot 目录下执行 make, output/build/busybox-1.27.2/.config 会被上面的 busybox.config 替换掉,
    也会在 output/target/usr/bin 生成 http 软连接文件,指向的是  output/target/bin/busybox

3. 新建 output/target/etc/httpd2.conf 配置文件(也可以不要此文件),
    参考: https://openwrt.org/docs/guide-user/services/webserver/http.httpd

4. 建立 output/target/init.d/S80httpd 文件:

/usr/sbin/httpd -p 80 -h /www -c /etc/httpd.conf

5. 新建  output/target/www/test.html 文件

<html>
        <head>
                <meta charset="utf-8">
                <title> hello whycan.cn</title>
        </head>

        <body>
                <b>I am come from whycan.cn.  </b>

                <p />

                <font color="red">Run in 君正Ingenic X1000</font>
        </body>

</html>

6. 新建 output/target/www/cgi-bin/ 文件夹
    再建文件: output/target/www/cgi-bin/test 脚本文件:

#!/bin/sh
echo "Content-type: text/html"
echo ""
echo ""
echo "<html><head><meta charset=\"utf-8\"><title>Sample CGI Output @ whycan.cn</title></head><body>"
echo "<font color=\"red\">测试测试 红色</font>"
echo "<p />"
echo "<font color=\"blue\">测试测试 蓝色</font>"
echo "<p />"

echo "</body></html>"

7. 打包,烧录,运行.

最近编辑记录 歌以咏志 (2019-09-21 11:26:43)

离线

#2 2019-09-21 11:28:39

歌以咏志
会员
注册时间: 2019-09-21
累计积分: 25

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

2019-09-21_105746.png

上图是test.html的显示页面

2019-09-21_112626.png
上图是test cgi脚本的显示页面

第一次学习html标签,做得丑,请大家多多包涵。

离线

#3 2019-09-21 13:02:40

jiangming1399
会员
注册时间: 2018-06-14
累计积分: 56

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

这个选项可以在busybox的menuconfig里面开吧,手动改配置感觉有点不方便

离线

#4 2019-09-21 14:30:23

歌以咏志
会员
注册时间: 2019-09-21
累计积分: 25

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

jiangming1399 说:

这个选项可以在busybox的menuconfig里面开吧,手动改配置感觉有点不方便

还真有这个命令: make busybox-menuconfig

用上面的命令就可以配置了。

离线

#5 2019-09-21 17:42:27

歌以咏志
会员
注册时间: 2019-09-21
累计积分: 25

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

离线

#6 2019-09-24 16:15:13

歌以咏志
会员
注册时间: 2019-09-21
累计积分: 25

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

发现用上面的比较麻烦, 找到 libfcgi 库, 在 buildroot 可以直接开启: BR2_PACKAGE_LIBFCGI=y

先进入目录 buildroot-2017.08.1/, 执行 make

再进入目录 buildroot-2017.08.1/output/build/libfcgi-2.4.0/examples, 执行 make

会生成好几个 cgi 程序, 拷贝到 rootfs 的 /www/cgi-bin/ 目录.

浏览器打开: http://192.168.1.33/cgi-bin/echo

2019-09-24_161345.png

一切 OK, 一个基本的 cgi 程序就跑起来了!!!

离线

#7 2019-09-24 17:36:41

歌以咏志
会员
注册时间: 2019-09-21
累计积分: 25

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

也可以用curl 命令测试这个 cgi 服务器:

curl -F "image=@echo.c"   http://192.168.1.33/cgi-bin/echo

curl -F "image=@echo.c"   -d "eeeeeeeee=ffffffff" http://192.168.1.33/cgi-bin/echo?aaaa=bbb\&ccc=dddddddddddddd

curl -d "eeeeeeeee=ffffffff&gggggg=hhhhh" http://192.168.1.33/cgi-bin/echo

离线

#8 2019-09-24 17:39:27

歌以咏志
会员
注册时间: 2019-09-21
累计积分: 25

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

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

int main()  
{  
    while(FCGI_Accept() >= 0)  
    {  
        char* strGetData = NULL;  
        int iContentLength = 0;  
        if (getenv("QUERY_STRING"))  
        {  
            strGetData = getenv("QUERY_STRING");  
        }  
        if (getenv("CONTENT_LENGTH"))  
        {  
            iContentLength = atoi(getenv("CONTENT_LENGTH"));  
        }  
        char* data = (char*)malloc(iContentLength + 1);  
        memset(data, 0, iContentLength + 1);  
        FCGI_fread(data, 1, iContentLength, FCGI_stdin);  
        FCGI_printf("Content-type:text/html\r\n\r\n");  
        FCGI_printf(data);
		
		FCGI_printf("iContentLength = %d\n", iContentLength);
#if 0		
		FILE* fp = fopen("tmp.txt", "w");
		fwrite(data, 1, iContentLength, fp);
		fclose(fp);
#endif
    }  
    return 0;  
}  

编译: /opt/buildroot-2017.08.1/output/host/bin/arm-linux-gcc  -o cgi_test cgi_test.c -lfcgi

curl测试(上传一个echo.c文件): curl -F "image=@echo.c"   http://192.168.1.33/cgi-bin/echo

离线

#9 2019-09-24 17:43:35

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,862

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

感谢分享, 一个微型嵌入式 cgi web 服务器诞生了, 楼主能不能再研究一下,把 lua 整合进去, 用lua脚本写网页服务器。

离线

#10 2019-10-15 17:51:51

歌以咏志
会员
注册时间: 2019-09-21
累计积分: 25

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

离线

#11 2019-10-16 15:09:33

歌以咏志
会员
注册时间: 2019-09-21
累计积分: 25

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

晕哥 说:

感谢分享, 一个微型嵌入式 cgi web 服务器诞生了, 楼主能不能再研究一下,把 lua 整合进去, 用lua脚本写网页服务器。

搞定cgi之后考虑整合一个 lua 进去,毕竟脚本编程方便太多。

离线

#12 2019-10-16 15:14:40

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 7,862

Re: 潜水很久了, 今天注册发个帖子说说 buildroot busybox 里面 添加 http 网页服务器

豆瓣这个博客不错: https://www.douban.com/note/541320499/

如何用c实现fastcgi文件上传 steven 2016-02-24 18:18:37

在现在web端中,fastcgi算是比较古老的方式,很多公司依然在用fastcgi可能是出于历史架构的原因,Fastcgi确实在后端能和C完美地结合。
用c + fastcgi来处理文件上传比较繁琐,需要处理MIME, 文件内容boundary问题等一些问题。
所以要实现c + fastcgi 文件上传只需要掌握以下2点就可以了.

1. 从 stdin 读上传的文件内容.
2. 处理第1点中文件boundary问题.

第1点比较容易,fread直接搞定
第2点关于boundary问题,根据 rfc1341 (https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html)
描述,所有从web端POST过来的数据都是用 boudnary分隔的, 比如上传文件内容:

------WebKitFormBoundarycKuywINaoWuIidOR\r\n
Content-Disposition: form-data; name="file"; filename="test.png"\r\n
Content-Type: application/x-gzip\r\n
\r\n
\r\b
文件内容
------WebKitFormBoundarycKuywINaoWuIidOR\r\n

实现代码:
https://github.com/pengxiaojun/Fastcgi_utils/blob/master/upload.cpp

离线

页脚