初试spawn-fcgi

初试spawn-fcgi无评论

2017年5月2日 at 下午9:46分类:其他 阅读: 359 次

1、下载fcgi库源码
ftp://ftp.slackware.com/.2/gentoo/distfiles/fcgi-2.4.0.tar.gz

2、编译
./configure --host=arm-linux --prefix=/opt/lib/fcgi -enable-static --disable-shared
make出现错误:
fcgio.cpp error: 'EOF' was not declared in this scope
fcgio.cpp增加#define EOF (-1)
/home/yushi/fcgi-2.4.0/libfcgi/fcgiapp.c:615: undefined reference to `frexp'
先make clean,然后修改 libfcgi目录下的Makefile,在LIBS那一行增加 -lm 参数

3、编译测试程序
建立testcgi.c文件:
#include <fcgi_stdio.h>
#include
int main()
{
int count = 0;
while(FCGI_Accept() >= 0)
{
printf("Content-type: text/html\r\n"
"\r\n"
""
"FastCGI Hello!"
"Request number %d running on host%s "
"Process ID: %d\n",
++count,
getenv("SERVER_NAME"), getpid());
}
return 0;
}

编译:
arm-linux-gcc testcgi.c -o testcgi -I /opt/lib/fcgi/include/ /opt/lib/fcgi/lib/libfcgi.a -lm

4、测试验证
上传testcgi到路由器上,运行:
spawn-fcgi -a 127.0.0.1 -p 8288 /usr/bin/testcgi
修改nginx配置,增加:
location ~ \.cgi$ {
fastcgi_pass 127.0.0.1:8288;
fastcgi_index index.cgi;
include fastcgi.conf;
}
重启后访问:
http://192.168.0.1:8180/1.cgi
会在浏览器输出:

5、环境变量
GET请求,它将数据打包放置在环境变量QUERY_STRING中,CGI从环境变量QUERY_STRING中获取数据。常见的环境变量如下表所示:

环境变数 内容
AUTH_TYPE 存取认证类型。
CONTENT_LENGTH 由标准输入传递给CGI程序的数据长度,以bytes或字元数来计算。
CONTENT_TYPE 请求的MIME类型。
GATEWAY_INTERFACE 服务器的CGI版本编号。
HTTP_ACCEPT 浏览器能直接接收的Content-types, 可以有HTTP Accept header定义.
HTTP_USER_AGENT 递交表单的浏览器的名称、版本 和其他平台性的附加信息。
HTTP_REFERER 递交表单的文本的 URL,不是所有的浏览器都发出这个信息,不要依赖它
PATH_INFO 传递给cgi程式的路径信息。
QUERY_STRING 传递给CGI程式的请求参数,也就是用"?"隔开,添加在URL后面的字串。
REMOTE_ADDR client端的host名称。
REMOTE_HOST client端的IP位址。
REMOTE_USER client端送出来的使用者名称。
REMOTE_METHOD client端发出请求的方法(如get、post)。
SCRIPT_NAME CGI程式所在的虚拟路径,如/cgi-bin/echo。
SERVER_NAME server的host名称或IP地址。
SERVER_PORT 收到request的server端口。
SERVER_PROTOCOL 所使用的通讯协定和版本编号。
SERVER_SOFTWARE server程序的名称和版本。

环境变量的大小是有一定的限制的,当需要传送的数据量大时,储存环境变量的空间可能会不足,造成数据接收不完全,甚至无法执行CGI程序。因此后来又发展出另外一种方法:POST,也就是利用I/O重新导向的技巧,让CGI程序可以由STDIN和STDOUT直接跟浏览器沟通。
当我们指定用这种方法传递请求的数据时,web 服务器收到数据后会先放在一块输入缓冲区中,并且将数据的大小记录在CONTENT_LENGTH这个环境变数,然后调用CGI程式并将CGI程序的STDIN指向这块缓冲区,于是我们就可以很顺利的通过STDIN和环境变数CONTENT_LENGTH得到所有的资料,再没有资料大小的限制了。

6、乘法程序
修改testcgi.c
#include
#include
int main()
{
char *data;
long m,n;
while(FCGI_Accept() >= 0)
{
printf("Content-Type:text/html\n\n");
printf("乘法结果 ");
printf("

乘法结果

");
data = getenv("QUERY_STRING");
if(data == NULL)
printf("

错误!数据没有被输入或者数据传输有问题

");
else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)
printf("

错误!输入数据非法。表单中输入的必须是数字。

");
else
printf("

%ld和%ld的乘积是:%ld。

",m,n,m*n);
}
return 0;
}

执行结果

初试json rpc

初试json rpc无评论

2017年4月28日 at 下午4:19分类:其他 阅读: 397 次

目标:
用C语言实现json rpc server,通过http作为客户端来获取信息

参考:
https://github.com/hmng/jsonrpc-c

编译过程:
下载:
git clone https://github.com/hmng/jsonrpc-c
cd jsonrpc-c
在Ubuntu下编译,先安装依赖库
sudo apt install libev-dev autoconf
配置:
autoreconf -i
./configure
编译:
make

生成的程序在~/jsonrpc-c/example/server

运行程序
~/jsonrpc-c/example/server
程序在1234端口进行监听

测试:
echo "{\"method\":\"sayHello\"}" | nc localhost 1234

交叉编译:
要编译出适合ARM系统运行的程序
1、首先编译libev
https://haoutil.com/topic/cross-compile-shadowsocks-libev
ver=4.24
wget http://dist.schmorp.de/libev/libev-$ver.tar.gz
tar zxf libev-$ver.tar.gz
cd libev-$ver
./configure --host=arm-linux --prefix=/opt/lib/libev --enable-shared
make && make install

2、再编译jsonrpc
先配置,注意指定libev的目录:
./configure --host=arm-linux --with-libev=/opt/lib/libev
编译
make
搞定:
2017-04-29 10-57-00
生成的程序~/jsonrpc-c/example/server是一个脚本程序,真正的程序在~/jsonrpc-c/example/.libs,包含两个程序lt-server、server,这两个程序调用了动态链接库libjsonrpcc.so
3、静态链接
要使用静态链接库,在配置libev时:
./configure --host=arm-linux --prefix=/opt/lib/libev -enable-static --disable-shared
在配置jsonrpc时:
./configure --host=arm-linux --with-libev=/opt/lib/libev --enable-static --disable-shared

手动编译libev的用户程序
比如程序源文件为libtest.c,编译用于ubuntu下的程序:
gcc libevtest.c /usr/lib/x86_64-linux-gnu/libev.so -o libevtest
编译用于arm的程序:
arm-linux-gcc -I/opt/lib/libev/include/ libevtest.c /opt/lib/libev/lib/libev.so -o libevtest_arm

Ubuntu编译entware

Ubuntu编译entware无评论

2017年4月27日 at 下午3:40分类:其他 阅读: 501 次

参考:
https://github.com/Entware-ng/Entware-ng/wiki/Compile-packages-from-sources

1、Ubuntu安装依赖包
和openwrt一样安装依赖包:
sudo apt-get install build-essential subversion libncurses5-dev zlib1g-dev gawk gcc-multilib flex git-core gettext libssl-dev mercurial unzip

2、下载Entware-ng
git clone https://github.com/Entware-ng/Entware-ng.git
cd Entware-ng

3、更新package
make package/symlinks
更新的包在~/Entware-ng/feeds/packages目录

4、拷贝配置文件
根据要编译的平台选择配置文件,比如要编译ARM V7平台:
~/Entware-ng$ cp configs/armv7.config .config

5、全部编译
make

6、分步编译
make tools/install
make toolchain/install
make target/compile
make package/compile
最后一行是编译所有包,可以替换成你需要的单个包进行编译

7、单个包编译
make package/squid/compile
查看错误信息:
make package/squid/compile V=s
多核编译
make package/squid/compile -j4

8、编译新包
比如要编译ssr:
https://github.com/ywb94/openwrt-ssr
步骤与openwrt一致
cd ~/Entware-ng
git clone https://github.com/ywb94/openwrt-ssr.git package/openwrt-ssr

make menuconfig
# 选择要编译的包,保存退出
#luci ->3. Applications-> luci-app-shadowsocksR 原始版本
#luci ->3. Applications-> luci-app-shadowsocksR-GFW GFWList版本

make package/openwrt-ssr/compile V=99
编译后生成的IPK在~/Entware-ng/bin/targets/armv7soft/generic-glibc/packages目录

在华硕AC1200G+环境下交叉编译AC9可执行程序

在华硕AC1200G+环境下交叉编译AC9可执行程序无评论

2017年4月18日 at 下午9:00分类:其他 阅读: 688 次

华硕AC1200G+目录:

/opt/ac1200g/asuswrt

先设置环境变量:
export PATH=$PATH:/opt/ac1200g/asuswrt/release/src-rt-9.x/src/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3/bin

export STAGING_DIR=/opt/ac1200g/asuswrt/release/src-rt-9.x/src/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/ac1200g/asuswrt/release/src-rt-9.x/src/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3/lib

新建一个c文件,如test.c

#include <stdlib.h>
int main() {
printf("Hello AC9\n");
}

编译:

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

上传到AC9上,运行

chmod 755 test

./test

交叉编译gdb
wget http://ftp.gnu.org/gnu/gdb/gdb-7.11.tar.gz
tar zxvf gdb-7.11.tar.gz
cd gdb-7.11
./configure --host=arm-linux
make

AC9的广告屏蔽功能

AC9的广告屏蔽功能无评论

2017年4月14日 at 上午9:24分类:其他 阅读: 1,013 次

adbyby没有可以在ac9官方固件下运行的可执行程序

openwrt自带了一个去广告的插件,叫privoxy

https://wiki.openwrt.org/zh-cn/doc/howto/proxy.privoxy

但是好像对视频广告不给力

https://routeragency.com/?p=324

https://github.com/uku/Unblock-Youku/issues/106

 

koolproxy有在ac9官方固件下运行的可执行程序,可以使用koolproxy作为定制版的去广告插件。