From a43e5c435f1a7d543e68b1eb5f071307ba902218 Mon Sep 17 00:00:00 2001 From: esrrhs Date: Wed, 30 Oct 2019 19:14:27 +0800 Subject: [PATCH] add --- client.go | 30 +++++++++++++++++------------- cmd/main.go | 16 ++++++++++++++-- server.go | 38 ++++++++++++++++++++++---------------- 3 files changed, 53 insertions(+), 31 deletions(-) diff --git a/client.go b/client.go index 220bd1d..28411ba 100644 --- a/client.go +++ b/client.go @@ -140,12 +140,12 @@ func (p *Client) RTT() time.Duration { return p.rtt } -func (p *Client) Run() { +func (p *Client) Run() error { conn, err := icmp.ListenPacket("ip4:icmp", "") if err != nil { loggo.Error("Error listening for ICMP packets: %s", err.Error()) - return + return err } defer conn.Close() p.conn = conn @@ -154,7 +154,7 @@ func (p *Client) Run() { tcplistenConn, err := net.ListenTCP("tcp", p.tcpaddr) if err != nil { loggo.Error("Error listening for tcp packets: %s", err.Error()) - return + return err } defer tcplistenConn.Close() p.tcplistenConn = tcplistenConn @@ -162,7 +162,7 @@ func (p *Client) Run() { listener, err := net.ListenUDP("udp", p.ipaddr) if err != nil { loggo.Error("Error listening for udp packets: %s", err.Error()) - return + return err } defer listener.Close() p.listenConn = listener @@ -183,16 +183,20 @@ func (p *Client) Run() { interval := time.NewTicker(time.Second) defer interval.Stop() - for !p.exit { - select { - case <-interval.C: - p.checkTimeoutConn() - p.ping() - p.showNet() - case r := <-recv: - p.processPacket(r) + go func() { + for !p.exit { + select { + case <-interval.C: + p.checkTimeoutConn() + p.ping() + p.showNet() + case r := <-recv: + p.processPacket(r) + } } - } + }() + + return nil } func (p *Client) Stop() { diff --git a/cmd/main.go b/cmd/main.go index 5af1823..cb0454d 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -6,6 +6,7 @@ import ( "github.com/esrrhs/go-engine/src/loggo" "github.com/esrrhs/pingtunnel" "strconv" + "time" ) var usage = ` @@ -137,7 +138,11 @@ func main() { return } loggo.Info("Server start") - s.Run() + err = s.Run() + if err != nil { + loggo.Error("Run ERROR: %s", err.Error()) + return + } } if *t == "client" { @@ -163,6 +168,13 @@ func main() { } loggo.Info("Client Listen %s (%s) Server %s (%s) TargetPort %s:", c.Addr(), c.IPAddr(), c.ServerAddr(), c.ServerIPAddr(), c.TargetAddr()) - c.Run() + err = c.Run() + if err != nil { + loggo.Error("Run ERROR: %s", err.Error()) + return + } + } + for { + time.Sleep(time.Hour) } } diff --git a/server.go b/server.go index 9317696..cb9d276 100644 --- a/server.go +++ b/server.go @@ -11,12 +11,14 @@ import ( func NewServer(key int) (*Server, error) { return &Server{ - key: key, + exit: false, + key: key, }, nil } type Server struct { - key int + exit bool + key int conn *icmp.PacketConn @@ -46,12 +48,12 @@ type ServerConn struct { tcpmode int } -func (p *Server) Run() { +func (p *Server) Run() error { conn, err := icmp.ListenPacket("ip4:icmp", "") if err != nil { loggo.Error("Error listening for ICMP packets: %s", err.Error()) - return + return err } p.conn = conn @@ -63,15 +65,19 @@ func (p *Server) Run() { interval := time.NewTicker(time.Second) defer interval.Stop() - for { - select { - case <-interval.C: - p.checkTimeoutConn() - p.showNet() - case r := <-recv: - p.processPacket(r) + go func() { + for !p.exit { + select { + case <-interval.C: + p.checkTimeoutConn() + p.showNet() + case r := <-recv: + p.processPacket(r) + } } - } + }() + + return nil } func (p *Server) processPacket(packet *Packet) { @@ -185,7 +191,7 @@ func (p *Server) RecvTCP(conn *ServerConn, id string, src *net.IPAddr) { loggo.Info("start wait remote connect tcp %s %s", conn.id, conn.tcpaddrTarget.String()) startConnectTime := time.Now() - for { + for !p.exit { if conn.fm.IsConnected() { break } @@ -218,7 +224,7 @@ func (p *Server) RecvTCP(conn *ServerConn, id string, src *net.IPAddr) { tcpActiveRecvTime := time.Now() tcpActiveSendTime := time.Now() - for { + for !p.exit { now := time.Now() sleep := true @@ -305,7 +311,7 @@ func (p *Server) RecvTCP(conn *ServerConn, id string, src *net.IPAddr) { } startCloseTime := time.Now() - for { + for !p.exit { now := time.Now() conn.fm.Update() @@ -360,7 +366,7 @@ func (p *Server) Recv(conn *ServerConn, id string, src *net.IPAddr) { loggo.Info("server waiting target response %s -> %s %s", conn.ipaddrTarget.String(), conn.id, conn.conn.LocalAddr().String()) - for { + for !p.exit { bytes := make([]byte, 2000) conn.conn.SetReadDeadline(time.Now().Add(time.Millisecond * 100))