From 42de342f1c1545b8b0068394fdd6cce0849312b8 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 6 Sep 2020 15:59:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=BB=E7=BA=BF=E5=8A=A0=E5=85=A5=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=EF=BC=8C=E6=B3=A8=E5=86=8C=E5=8C=85=E5=B0=9A=E6=9C=AA?= =?UTF-8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dbus/server.go | 55 +++++++++++++++++++++++++++++++++------ main.go | 9 +++++++ packet/{id.go => type.go} | 2 +- 3 files changed, 57 insertions(+), 9 deletions(-) rename packet/{id.go => type.go} (100%) diff --git a/dbus/server.go b/dbus/server.go index c782ce1..628d9a1 100644 --- a/dbus/server.go +++ b/dbus/server.go @@ -1,9 +1,12 @@ package dbus import ( + "errors" + "github.com/zgwit/dtu-admin/base" "github.com/zgwit/dtu-admin/packet" "log" "net" + "strings" ) type Server struct { @@ -47,14 +50,32 @@ func (s *Server) accept() { } func (s *Server) receive(conn net.Conn) { - buf := make([]byte, 1024) - //TODO 接收Key,并校验 var parser packet.Parser + buf := make([]byte, 1024) - - c := NewClient() - //p := &Plugin{conn: conn} + //接收第一个包,作为类型校验 + n, e := conn.Read(buf) + if e != nil { + log.Println(e) + return + } + packs := parser.Parse(buf[:n]) + if len(packs) == 0 { + _ = conn.Close() + return + } + //根据第一个包创建客户羰 + c, e := s.createTunnel(packs[0]) + if e != nil { + _, _ = conn.Write([]byte(e.Error())) + _ = conn.Close() + return + } + //处理第一次接收的剩余包(网络拥堵时,可能会发生) + for _, pack := range packs[1:] { + c.Handle(pack) + } for { n, e := conn.Read(buf) @@ -68,12 +89,30 @@ func (s *Server) receive(conn net.Conn) { } } - //关闭透传 - c.CLose() + //关闭 + _ = c.CLose() } +func (s *Server) createTunnel(p *packet.Packet) (base.Client, error) { + if p.Type != packet.TypeConnect { + //告诉客户端,第一个包必须是注册包 + return nil, errors.New("first packet must be connect") + } + + register := string(p.Data) + rs := strings.Split(register, ":") + switch rs[0] { + case "peer": + //TODO 解析 peer:key + + case "plugin": + //TODO 解析 plugin:key:secret + + } + return nil, errors.New("未支持的类型") +} -func ListenAndServe(addr string) error { +func Start(addr string) error { s := &Server{ Net: "tcp", Addr: addr, diff --git a/main.go b/main.go index 81c50eb..a42bb15 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "github.com/denisbrodbeck/machineid" "github.com/zgwit/dtu-admin/conf" "github.com/zgwit/dtu-admin/db" + "github.com/zgwit/dtu-admin/dbus" "github.com/zgwit/dtu-admin/dtu" "github.com/zgwit/dtu-admin/flag" "github.com/zgwit/dtu-admin/web" @@ -45,6 +46,13 @@ func main() { return } + //启动总线 TODO 添加配置 + err = dbus.Start(":1843") + if err != nil { + log.Println("总线启动失败:", err) + return + } + //恢复之前的链接 err = dtu.Recovery() if err != nil { @@ -52,6 +60,7 @@ func main() { return } + //启动Web服务 web.Serve() } diff --git a/packet/id.go b/packet/type.go similarity index 100% rename from packet/id.go rename to packet/type.go index 88bd266..a781e32 100644 --- a/packet/id.go +++ b/packet/type.go @@ -13,12 +13,12 @@ const ( TypeHeartBeak TypePing TypePong + TypeError //透传 TypeTransfer = iota + 10 TypeOnline //上线 TypeOffline //掉线 - TypeError ) -- GitLab