由于openwrt的web管理界面luci的后台完全由Lua写的,标准的Lua库是不足以完成这个任务的,需要扩展其他库来完成,所以openwrt的Lua的目标目录下(一般为/usr/lib/lua)会有一个nixio.so动态链接库,许多扩展可以从该库。鉴于Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。
nixio中有许多扩展的方法,其中有bit库,socket库,TLS库,crypto库,File库等等。详情可以看luci在github上的wiki关于nixio的API当然最好是git clone下来好好看一下源码。
本应用要使用socket,从nixio中导出socket是一种方法,还有一种方法是用opkg包管理工具安装luasocket扩展包,这个扩展包比nixio的socket更为丰富,也更大。
我这里只是简单发送udp包,并且想尽可能的保留路由上有限的存储,所以使用前者:
socket = require "nixio".socket --返回的socket是一个生成Socket类的构造函数
这时就可以用socket函数来生成socket实例了:
sock = socket("inet", "dgram") --UDP
tcp_sock = socket("inet", "stream") --TCP
然后可以可选地使用setopt成员函数去设置socket的option,这里简单地设置其可重用SO_REUSEADDR为true和接收超时为3s:
sock:setopt("socket", "reuseaddr", 1)
sock:setopt("socket", "rcvtimeo", 3)
发送udp包可以使用sentto:
sock:sendto("Hello world!", "8.8.8.8", 12345) --返回发送的字节数
接收可以使用recvfrom:
msg, _, _ = sock:recvfrom(5) --返回1.接收的数据;2.发送方的ip;3.发送方的端口
其他更多的操作详见luci在github上的document。
至此,整个应用所需要的网络支持都已经具备,只需要构造好UDP包,就可以发送到校园服务器,获取拨号权限了。