(原) Zerotier应用

原创文章,请后转载,并注明出处。

一直在用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的使用方法。