From a28fc33b66a9ff72cfcdfeb5981f82380e223abb Mon Sep 17 00:00:00 2001 From: TenderIronh Date: Fri, 10 Dec 2021 17:20:17 +0800 Subject: [PATCH] fix nil pointer and testing public ip --- nat.go | 29 +++++++++++++++++++++++++++++ p2papp.go | 7 ++++++- protocol.go | 4 ++-- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/nat.go b/nat.go index 3ebbe8b..d82e2ea 100644 --- a/nat.go +++ b/nat.go @@ -39,6 +39,35 @@ func natTest(serverHost string, serverPort int, localPort int, echoPort int) (pu } natRsp := NatDetectRsp{} err = json.Unmarshal(buffer[openP2PHeaderSize:nRead], &natRsp) + + // testing for public ip + if echoPort != 0 { + for { + gLog.Printf(LevelINFO, "public ip test start %s:%d", natRsp.IP, echoPort) + conn, err := net.ListenUDP("udp", nil) + if err != nil { + break + } + defer conn.Close() + dst, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", natRsp.IP, echoPort)) + if err != nil { + break + } + conn.WriteTo([]byte("echo"), dst) + buf := make([]byte, 1600) + + // wait for echo testing + conn.SetReadDeadline(time.Now().Add(PublicIPEchoTimeout)) + _, _, err = conn.ReadFromUDP(buf) + if err == nil { + gLog.Println(LevelINFO, "public ip:YES") + natRsp.IsPublicIP = 1 + } else { + gLog.Println(LevelINFO, "public ip:NO") + } + break + } + } return natRsp.IP, natRsp.IsPublicIP, natRsp.Port, nil } diff --git a/p2papp.go b/p2papp.go index c25e110..e0031b6 100644 --- a/p2papp.go +++ b/p2papp.go @@ -24,6 +24,9 @@ type p2pApp struct { } func (app *p2pApp) isActive() bool { + if app.tunnel == nil { + return false + } if app.rtid == 0 { // direct mode app heartbeat equals to tunnel heartbeat return app.tunnel.isActive() } @@ -119,7 +122,9 @@ func (app *p2pApp) close() { if app.listener != nil { app.listener.Close() } - app.tunnel.closeOverlayConns(app.id) + if app.tunnel != nil { + app.tunnel.closeOverlayConns(app.id) + } app.wg.Wait() } diff --git a/protocol.go b/protocol.go index d59abf8..22b4978 100644 --- a/protocol.go +++ b/protocol.go @@ -11,7 +11,7 @@ import ( "time" ) -const OpenP2PVersion = "0.96.0" +const OpenP2PVersion = "0.96.1" const ProducnName string = "openp2p" type openP2PHeader struct { @@ -127,7 +127,7 @@ const ( AESKeySize = 16 MaxRetry = 10 RetryInterval = time.Second * 30 - PublicIPEchoTimeout = time.Second * 5 + PublicIPEchoTimeout = time.Second * 3 NatTestTimeout = time.Second * 10 )