一直在用ZeroTier,搭载于互联网的内网服务软件。
它需要首先在官网登陆,建立自己的内网及设置。
我想用它来建立一个去中心的自由网络:
比如有几个朋友,各自有一套自己的内网,并在内网中建立了各类服务。当他愿意开放出来供自己这一批朋友玩耍时,它就可以开放内网给大家。
这时就需要ZeroTier客户端能自动加入这个开放的内网。当然也可以随时收回。看起来就象朋友给我们开了门,请我们去他家逛逛。
在网上找到了一个关于客户端的库:github.com/zerotier/go-ztcentral
它可以列出我的可用网络,以及网络中的成员情况。虽然这并不是我想要的。
package main
import (
"context"
"log"
"os"
"time"
ztcentral "github.com/zerotier/go-ztcentral"
)
func main() {
c, err := ztcentral.NewClient("TOKEN") // TOKEN要登陆中心Account项中生成
if err != nil {
panic(err)
}
ctx := context.Background()
// 网络列表
networks, err := c.GetNetworks(ctx)
if err != nil {
log.Println("error:", err.Error())
os.Exit(1)
}
// 显示网络和成员
for _, n := range networks {
log.Printf("ID:%s\t 名称:%s \t 在线数: %d/%d \t 授权数:%d", *n.Id, *n.Config.Name, *n.OnlineMemberCount, *n.TotalMemberCount, *n.AuthorizedMemberCount)
members, err := c.GetMembers(ctx, *n.Id) // 获取成员
if err != nil {
log.Println("error:", err.Error())
os.Exit(1)
}
log.Printf(" ID ========================================== Name === Last Online Time =====")
for _, m := range members {
t := UnixMilliToTime(*m.LastOnline)
if t.Format("2006-01-02") == time.Now().Format("2006-01-02") {
log.Printf(" %s\t %14s %s <<<", *m.Id, *m.Name, t.Format("2006-01-02 15:04:05"))
} else {
log.Printf(" %s\t %14s %s", *m.Id, *m.Name, t.Format("2006-01-02 15:04:05"))
}
}
log.Print(" ===============================================================================")
}
}
// 秒级时间戳转time
func UnixSecondToTime(second int64) time.Time {
return time.Unix(second, 0)
}
// 毫秒级时间戳转time
func UnixMilliToTime(milli int64) time.Time {
return time.Unix(milli/1000, (milli%1000)*(1000*1000))
}
// 纳秒级时间戳转time
func UnixNanoToTime(nano int64) time.Time {
return time.Unix(nano/(1000*1000*1000), nano%(1000*1000*1000))
}
https://docs.zerotier.com/sockets/tutorial.html
https://github.com/zerotier/libzt
这两个似乎才是通过代码控制网络通信,很可惜没有Golang的使用方法。