From 2441534a930f4cfc96eed34e26fc8574167b8f4f Mon Sep 17 00:00:00 2001 From: CHN-STUDENT Date: Mon, 14 Dec 2020 09:25:32 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clients/golang/awesomeProject/main.go | 4 ++-- clients/golang/awesomeProject/ping.go | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/clients/golang/awesomeProject/main.go b/clients/golang/awesomeProject/main.go index f8cba48..cca37b9 100644 --- a/clients/golang/awesomeProject/main.go +++ b/clients/golang/awesomeProject/main.go @@ -179,8 +179,8 @@ func getLoad() { } var CU_ADDR = CU + ":" + strconv.Itoa(PORBEPORT) -var CT_ADDR = CU + ":" + strconv.Itoa(PORBEPORT) -var CM_ADDR = CU + ":" + strconv.Itoa(PORBEPORT) +var CT_ADDR = CT + ":" + strconv.Itoa(PORBEPORT) +var CM_ADDR = CM + ":" + strconv.Itoa(PORBEPORT) func getNetworkStatus() { defaulttimeout := 1 * time.Second diff --git a/clients/golang/awesomeProject/ping.go b/clients/golang/awesomeProject/ping.go index f203f66..5065337 100644 --- a/clients/golang/awesomeProject/ping.go +++ b/clients/golang/awesomeProject/ping.go @@ -39,13 +39,13 @@ func (pingValue *PingValue) RunCU() { pingValue.mtx.Lock() t := time.Now() conn , err := net.DialTimeout("tcp",CU_ADDR,defaulttimeout) - defer conn.Close() + //defer conn.Close() if err != nil { fmt.Println("Error try to connect China unicom :", err) - conn.Close() + _ = conn.Close() lostPacket += 1 } else { - conn.Close() + _ = conn.Close() } diffTime := time.Since(t) //TODO:三网延迟和丢包率算法存在问题 @@ -55,7 +55,7 @@ func (pingValue *PingValue) RunCU() { pingValue.lostRate = float64(lostPacket/allPacket) } pingValue.ping = uint64(diffTime/time.Millisecond) - resetTime := uint64(time.Since(startTime) * time.Second) + resetTime := uint64(time.Since(startTime) / time.Second) if resetTime > 3600 { lostPacket = 0 allPacket = 0 @@ -84,13 +84,13 @@ func (pingValue *PingValue) RunCT() { pingValue.mtx.Lock() t := time.Now() conn , err := net.DialTimeout("tcp",CT_ADDR,defaulttimeout) - defer conn.Close() + //defer conn.Close() if err != nil { fmt.Println("Error try to connect China Telecom :", err) - conn.Close() + _ = conn.Close() lostPacket += 1 } else { - conn.Close() + _ = conn.Close() } diffTime := time.Since(t) allPacket += 1 @@ -98,7 +98,7 @@ func (pingValue *PingValue) RunCT() { pingValue.lostRate = float64(lostPacket/allPacket) } pingValue.ping = uint64(diffTime/time.Millisecond) - resetTime := uint64(time.Since(startTime) * time.Second) + resetTime := uint64(time.Since(startTime) / time.Second) if resetTime > 3600 { lostPacket = 0 allPacket = 0 @@ -126,14 +126,14 @@ func (pingValue *PingValue) RunCM() { case <-t.C: pingValue.mtx.Lock() t := time.Now() - conn , err := net.DialTimeout("tcp",CT_ADDR,defaulttimeout) - defer conn.Close() + conn , err := net.DialTimeout("tcp",CM_ADDR,defaulttimeout) + //defer conn.Close() if err != nil { fmt.Println("Error try to connect China mobile :", err) - conn.Close() + _ = conn.Close() lostPacket += 1 } else { - conn.Close() + _ = conn.Close() } diffTime := time.Since(t) allPacket += 1 @@ -141,7 +141,7 @@ func (pingValue *PingValue) RunCM() { pingValue.lostRate = float64(lostPacket/allPacket) } pingValue.ping = uint64(diffTime/time.Millisecond) - resetTime := uint64(time.Since(startTime) * time.Second) + resetTime := uint64(time.Since(startTime) / time.Second) if resetTime > 3600 { lostPacket = 0 allPacket = 0 From 4aeb26f91519f122918625e0363ff585ef9e44d8 Mon Sep 17 00:00:00 2001 From: CHN-STUDENT Date: Wed, 23 Dec 2020 11:08:15 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=A4=96=E7=BD=91=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BB=8D=E5=9C=A8=E5=A4=84=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=B8=80=E4=BA=9B=E5=B0=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clients/golang/awesomeProject/README.MD | 11 +-- clients/golang/awesomeProject/main.go | 106 ++++++++++++++-------- clients/golang/awesomeProject/netSpeed.go | 65 ++++++------- clients/golang/awesomeProject/ping.go | 18 ++-- 4 files changed, 110 insertions(+), 90 deletions(-) diff --git a/clients/golang/awesomeProject/README.MD b/clients/golang/awesomeProject/README.MD index a4265a9..9592314 100644 --- a/clients/golang/awesomeProject/README.MD +++ b/clients/golang/awesomeProject/README.MD @@ -2,12 +2,6 @@ 懒得改项目名了,需要的话自己改。 -### 编译环境 - -CentOS7: go version go1.15.5 linux/amd64 - -Windows10: go version go1.15.5 windows/amd64 - ### 使用方法 可选:更改源码中的连接信息 ``` @@ -19,7 +13,10 @@ go build . ``` ### TODO -- IPV4 和 IPV6 状态 + +- 外网连接状态 +- 三网丢包计算 +- 三网延迟计算 - 其他算法优化 ### 鸣谢 diff --git a/clients/golang/awesomeProject/main.go b/clients/golang/awesomeProject/main.go index cca37b9..6ce0b5c 100644 --- a/clients/golang/awesomeProject/main.go +++ b/clients/golang/awesomeProject/main.go @@ -10,6 +10,9 @@ package main import ( "fmt" + "os/signal" + "syscall" + //下面这是已经封装好的轮子 "github.com/bitcav/nitr-core/cpu" "github.com/bitcav/nitr-core/host" @@ -35,9 +38,9 @@ var ( PASSWORD string = "123456" INTERVAL int = 1 PORBEPORT int = 80 - CU string = "cu.tz.cloudcpp.com" - CT string = "ct.tz.cloudcpp.com" - CM string = "cm.tz.cloudcpp.com" + CU string = "cu.tz.cloudcpp.com" //120.52.99.224 河北联通 + CT string = "ct.tz.cloudcpp.com" //183.78.182.66 北京电信 + CM string = "cm.tz.cloudcpp.com" //211.139.145.129 广州移动 ) type ClientInfo struct { @@ -147,13 +150,14 @@ func spaceCount() { strings.Index(fsType, "fat32") < 0 && strings.Index(fsType, "exfat") < 0 && strings.Index(fsType, "xfs") < 0 { - //if(d.Device == "A") { //特殊盘符自己写处理 - continue - //} } else { - diskUsageOf, _ := disk.Usage(d.Mountpoint) - used += diskUsageOf.Used - total += diskUsageOf.Total + if strings.Index(d.Device, "Z:") > -1 { //特殊盘符自己写处理 + continue + } else { + diskUsageOf, _ := disk.Usage(d.Mountpoint) + used += diskUsageOf.Used + total += diskUsageOf.Total + } } } clientInfo.HddUsed = used / 1024.0 / 1024.0 @@ -186,32 +190,26 @@ func getNetworkStatus() { defaulttimeout := 1 * time.Second count := 0 conn1 , err1 := net.DialTimeout("tcp",CU_ADDR,defaulttimeout) - defer conn1.Close() if err1 != nil { fmt.Println("Error try to connect China unicom :", err1) count += 1 - conn1.Close() - } else { - conn1.Close() + return } + defer conn1.Close() conn2 , err2 := net.DialTimeout("tcp", CT_ADDR,defaulttimeout) - defer conn2.Close() if err2 != nil { fmt.Println("Error try to connect China telecom :", err2) count += 1 - conn2.Close() - } else { - conn2.Close() + return } + defer conn2.Close() conn3 , err3 := net.DialTimeout("tcp", CM_ADDR,defaulttimeout) - defer conn3.Close() if err3 != nil { fmt.Println("Error try to connect China mobile :", err3) count += 1 - conn3.Close() - } else { - conn3.Close() + return } + defer conn3.Close() if count >= 2 { clientInfo.IpStatus = false } else { @@ -232,8 +230,33 @@ func bytes2str(b []byte) string { var clientInfo ClientInfo +func SetupCloseHandler() { + c := make(chan os.Signal) + signal.Notify(c, os.Interrupt, syscall.SIGTERM) + go func() { + <-c + fmt.Println("\r- Ctrl+C pressed in Terminal,Stop client program") + if mainConnect != nil { + pingValueCU.Stop() + pingValueCT.Stop() + pingValueCM.Stop() + netSpeed.Stop() + mainConnect.Close() + } + os.Exit(0) + }() +} + +var mainConnect net.Conn +var netSpeed *NetSpeed +var pingValueCU *PingValue +var pingValueCT *PingValue +var pingValueCM *PingValue func main() { + // Setup our Ctrl+C handler + SetupCloseHandler() + for _, args := range os.Args { if strings.Index(args,"SERVER") > -1 { strArr := strings.Split(args,"SERVER=") @@ -253,25 +276,37 @@ func main() { } } defaulttimeout := 30 * time.Second + clientInfo = NewDefaultClientInfo() + netSpeed = NewNetSpeed() + pingValueCU = NewPingValue() + pingValueCT = NewPingValue() + pingValueCM = NewPingValue() + //pingValueCU.RunCU() + //pingValueCT.RunCT() + //pingValueCM.RunCM() + netSpeed.Run() for { - conn , err := net.DialTimeout("tcp", SERVER + ":" + strconv.Itoa(PORT),defaulttimeout) + var err error + mainConnect , err = net.DialTimeout("tcp", SERVER + ":" + strconv.Itoa(PORT),defaulttimeout) if err != nil { fmt.Println("Error listening:", err) } - defer conn.Close() + defer mainConnect.Close() buff := make([]byte, 1024) - conn.Read(buff) + mainConnect.Read(buff) str := bytes2str(buff) if strings.Index(str,"Authentication required") > -1 { auth := str2bytes(USER + ":" + PASSWORD + "\n") - _ , err = conn.Write(auth) + _ , err = mainConnect.Write(auth) if err != nil { fmt.Println("Error Sending auth info:", err) + return } buff = make([]byte, 1024) - _ , err = conn.Read(buff) + _ , err = mainConnect.Read(buff) if err != nil { fmt.Println("Error Getting Server Data:", err) + return } str = bytes2str(buff) if strings.Index(str,"Authentication required") < 0 { @@ -283,9 +318,10 @@ func main() { fmt.Println(str) if strings.Index(str,"You are connecting via") < 0 { buff = make([]byte, 1024) - _ , err = conn.Read(buff) + _ , err = mainConnect.Read(buff) if err != nil { fmt.Println("Error Getting Server Data:", err) + return } str = bytes2str(buff) fmt.Println(str) @@ -299,21 +335,11 @@ func main() { fmt.Println(str) } fmt.Println(checkIP) - clientInfo = NewDefaultClientInfo() - netSpeed := NewNetSpeed() - pingValueCU := NewPingValue() - pingValueCT := NewPingValue() - pingValueCM := NewPingValue() - pingValueCU.RunCU() - pingValueCT.RunCT() - pingValueCM.RunCM() - netSpeed.Run() for { clientInfo.MemoryTotal = ram.Info().Total / 1024 // 需要转单位 clientInfo.MemoryUsed = ram.Info().Usage / 1024 // 需要转单位 clientInfo.CPU = cpu.Info().Usage clientInfo.Uptime = host.Info().Uptime - //swap 没有造好的轮子,自己加的 swapMemory, _ := mem.SwapMemory() clientInfo.SwapTotal = swapMemory.Total / 1024 // 需要转单位 @@ -322,7 +348,7 @@ func main() { tupd() trafficCount() spaceCount() - getNetworkStatus() + //getNetworkStatus() netSpeed.Get() clientInfo.Ping10086, clientInfo.Time10086 = pingValueCM.Get() clientInfo.Ping189, clientInfo.Time189 = pingValueCT.Get() @@ -333,12 +359,14 @@ func main() { //fmt.Println(data) if err != nil { fmt.Println("Transformation Error: ", err) + return } info := "update " + data + "\n" //fmt.Println(info) - _ , err = conn.Write(str2bytes(info)) + _ , err = mainConnect.Write(str2bytes(info)) if err != nil { fmt.Println("Error Sending Data Info:", err) + return } } } diff --git a/clients/golang/awesomeProject/netSpeed.go b/clients/golang/awesomeProject/netSpeed.go index 952a896..781d042 100644 --- a/clients/golang/awesomeProject/netSpeed.go +++ b/clients/golang/awesomeProject/netSpeed.go @@ -37,40 +37,41 @@ func (netSpeed *NetSpeed) Run() { t := time.NewTicker(t1) for { select { - case <- netSpeed.stop: - t.Stop() - return - case <-t.C: - netSpeed.mtx.Lock() - var bytesSent uint64 = 0 - var bytesRecv uint64 = 0 - netInfo, err := nnet.IOCounters(true) - if err != nil { - fmt.Println("Get network speed error:",err) - } - for _, v := range netInfo { - if strings.Index(v.Name,"lo") > -1 || - strings.Index(v.Name,"tun") > -1 || - strings.Index(v.Name,"docker") > -1 || - strings.Index(v.Name,"veth") > -1 || - strings.Index(v.Name,"br-") > -1 || - strings.Index(v.Name,"vmbr") > -1 || - strings.Index(v.Name,"vnet") > -1 || - strings.Index(v.Name,"kube") > -1 { - continue + + case <- netSpeed.stop: + t.Stop() + return + case <-t.C: + netSpeed.mtx.Lock() + var bytesSent uint64 = 0 + var bytesRecv uint64 = 0 + netInfo, err := nnet.IOCounters(true) + if err != nil { + fmt.Println("Get network speed error:",err) } - bytesSent += v.BytesSent - bytesRecv += v.BytesRecv + for _, v := range netInfo { + if strings.Index(v.Name,"lo") > -1 || + strings.Index(v.Name,"tun") > -1 || + strings.Index(v.Name,"docker") > -1 || + strings.Index(v.Name,"veth") > -1 || + strings.Index(v.Name,"br-") > -1 || + strings.Index(v.Name,"vmbr") > -1 || + strings.Index(v.Name,"vnet") > -1 || + strings.Index(v.Name,"kube") > -1 { + continue + } + bytesSent += v.BytesSent + bytesRecv += v.BytesRecv + } + timeUnix:= float64(time.Now().Unix()) + netSpeed.diff = timeUnix - netSpeed.clock + netSpeed.clock = timeUnix + netSpeed.netrx = float64(bytesRecv - netSpeed.avgrx)/netSpeed.diff + netSpeed.nettx = float64(bytesSent - netSpeed.avgtx)/netSpeed.diff + netSpeed.avgtx = bytesSent + netSpeed.avgrx = bytesRecv + netSpeed.mtx.Unlock() } - timeUnix:= float64(time.Now().Unix()) - netSpeed.diff = timeUnix - netSpeed.clock - netSpeed.clock = timeUnix - netSpeed.netrx = float64(bytesRecv - netSpeed.avgrx)/netSpeed.diff - netSpeed.nettx = float64(bytesSent - netSpeed.avgtx)/netSpeed.diff - netSpeed.avgtx = bytesSent - netSpeed.avgrx = bytesRecv - netSpeed.mtx.Unlock() - } } }() } diff --git a/clients/golang/awesomeProject/ping.go b/clients/golang/awesomeProject/ping.go index 5065337..a57e7f4 100644 --- a/clients/golang/awesomeProject/ping.go +++ b/clients/golang/awesomeProject/ping.go @@ -39,14 +39,12 @@ func (pingValue *PingValue) RunCU() { pingValue.mtx.Lock() t := time.Now() conn , err := net.DialTimeout("tcp",CU_ADDR,defaulttimeout) - //defer conn.Close() if err != nil { fmt.Println("Error try to connect China unicom :", err) - _ = conn.Close() lostPacket += 1 - } else { - _ = conn.Close() + return } + defer conn.Close() diffTime := time.Since(t) //TODO:三网延迟和丢包率算法存在问题 //fmt.Println(diffTime) @@ -84,14 +82,12 @@ func (pingValue *PingValue) RunCT() { pingValue.mtx.Lock() t := time.Now() conn , err := net.DialTimeout("tcp",CT_ADDR,defaulttimeout) - //defer conn.Close() if err != nil { fmt.Println("Error try to connect China Telecom :", err) - _ = conn.Close() lostPacket += 1 - } else { - _ = conn.Close() + return } + defer conn.Close() diffTime := time.Since(t) allPacket += 1 if allPacket > 100 { @@ -127,14 +123,12 @@ func (pingValue *PingValue) RunCM() { pingValue.mtx.Lock() t := time.Now() conn , err := net.DialTimeout("tcp",CM_ADDR,defaulttimeout) - //defer conn.Close() if err != nil { fmt.Println("Error try to connect China mobile :", err) - _ = conn.Close() lostPacket += 1 - } else { - _ = conn.Close() + return } + defer conn.Close() diffTime := time.Since(t) allPacket += 1 if allPacket > 100 { From fcb0f6a4e6d187756acec132d32ba6933ef7a65b Mon Sep 17 00:00:00 2001 From: CHN-STUDENT Date: Thu, 24 Dec 2020 15:16:35 +0800 Subject: [PATCH 3/3] try to fixed #3 --- clients/golang/awesomeProject/main.go | 47 +++++++++++------- clients/golang/awesomeProject/ping.go | 68 +++++++++++++++++++++------ 2 files changed, 83 insertions(+), 32 deletions(-) diff --git a/clients/golang/awesomeProject/main.go b/clients/golang/awesomeProject/main.go index 6ce0b5c..91bc497 100644 --- a/clients/golang/awesomeProject/main.go +++ b/clients/golang/awesomeProject/main.go @@ -191,25 +191,40 @@ func getNetworkStatus() { count := 0 conn1 , err1 := net.DialTimeout("tcp",CU_ADDR,defaulttimeout) if err1 != nil { - fmt.Println("Error try to connect China unicom :", err1) + fmt.Println("[getNetworkStatus]Error try to connect China unicom :", err1) count += 1 - return } - defer conn1.Close() + tcpconn1, ok := conn1.(*net.TCPConn) + if ok { + tcpconn1.SetLinger(0) + } + if conn1 != nil { + conn1.Close() + } conn2 , err2 := net.DialTimeout("tcp", CT_ADDR,defaulttimeout) if err2 != nil { - fmt.Println("Error try to connect China telecom :", err2) + fmt.Println("[getNetworkStatus]Error try to connect China telecom :", err2) count += 1 - return } - defer conn2.Close() + tcpconn2, ok := conn2.(*net.TCPConn) + if ok { + tcpconn2.SetLinger(0) + } + if conn2 != nil { + conn2.Close() + } conn3 , err3 := net.DialTimeout("tcp", CM_ADDR,defaulttimeout) if err3 != nil { - fmt.Println("Error try to connect China mobile :", err3) + fmt.Println("[getNetworkStatus]Error try to connect China mobile :", err3) count += 1 - return } - defer conn3.Close() + tcpconn3, ok := conn2.(*net.TCPConn) + if ok { + tcpconn3.SetLinger(0) + } + if conn3 != nil { + conn3.Close() + } if count >= 2 { clientInfo.IpStatus = false } else { @@ -281,9 +296,9 @@ func main() { pingValueCU = NewPingValue() pingValueCT = NewPingValue() pingValueCM = NewPingValue() - //pingValueCU.RunCU() - //pingValueCT.RunCT() - //pingValueCM.RunCM() + pingValueCU.RunCU() + pingValueCT.RunCT() + pingValueCM.RunCM() netSpeed.Run() for { var err error @@ -348,25 +363,23 @@ func main() { tupd() trafficCount() spaceCount() - //getNetworkStatus() + getNetworkStatus() netSpeed.Get() clientInfo.Ping10086, clientInfo.Time10086 = pingValueCM.Get() clientInfo.Ping189, clientInfo.Time189 = pingValueCT.Get() clientInfo.Ping10010, clientInfo.Time10010 = pingValueCU.Get() - //fmt.Println(clientInfo.Time10086) //结构体转json字符串 data, err := jsoniter.MarshalToString(&clientInfo) //fmt.Println(data) if err != nil { fmt.Println("Transformation Error: ", err) - return + break } info := "update " + data + "\n" - //fmt.Println(info) _ , err = mainConnect.Write(str2bytes(info)) if err != nil { fmt.Println("Error Sending Data Info:", err) - return + break } } } diff --git a/clients/golang/awesomeProject/ping.go b/clients/golang/awesomeProject/ping.go index a57e7f4..0d54597 100644 --- a/clients/golang/awesomeProject/ping.go +++ b/clients/golang/awesomeProject/ping.go @@ -28,6 +28,7 @@ func (pingValue *PingValue) RunCU() { t := time.NewTicker(t1) var lostPacket = 0 var allPacket = 0 + var lostConnect = false startTime := time.Now() defaulttimeout := 1 * time.Second for { @@ -40,19 +41,32 @@ func (pingValue *PingValue) RunCU() { t := time.Now() conn , err := net.DialTimeout("tcp",CU_ADDR,defaulttimeout) if err != nil { - fmt.Println("Error try to connect China unicom :", err) + fmt.Println("[ping]Error try to connect China unicom :", err) + lostConnect = true lostPacket += 1 - return } - defer conn.Close() + tcpconn, ok := conn.(*net.TCPConn) + if ok { + tcpconn.SetLinger(0) + } + if conn != nil { + conn.Close() + } diffTime := time.Since(t) //TODO:三网延迟和丢包率算法存在问题 //fmt.Println(diffTime) allPacket += 1 if allPacket > 100 { - pingValue.lostRate = float64(lostPacket/allPacket) + pingValue.lostRate = float64(lostPacket/allPacket) * 100 } - pingValue.ping = uint64(diffTime/time.Millisecond) + //fmt.Println("ALL LOST RATE") + //fmt.Printf("%10d %10d %10f\n",allPacket,lostPacket,pingValue.lostRate) + if lostConnect { + pingValue.ping = 0 + } else { + pingValue.ping = uint64(diffTime/time.Millisecond) + } + lostConnect = false resetTime := uint64(time.Since(startTime) / time.Second) if resetTime > 3600 { lostPacket = 0 @@ -71,6 +85,7 @@ func (pingValue *PingValue) RunCT() { t := time.NewTicker(t1) var lostPacket = 0 var allPacket = 0 + var lostConnect = false startTime := time.Now() defaulttimeout := 1 * time.Second for { @@ -83,17 +98,28 @@ func (pingValue *PingValue) RunCT() { t := time.Now() conn , err := net.DialTimeout("tcp",CT_ADDR,defaulttimeout) if err != nil { - fmt.Println("Error try to connect China Telecom :", err) + fmt.Println("[ping]Error try to connect China Telecom :", err) + lostConnect = true lostPacket += 1 - return } - defer conn.Close() + tcpconn, ok := conn.(*net.TCPConn) + if ok { + tcpconn.SetLinger(0) + } + if conn != nil { + conn.Close() + } diffTime := time.Since(t) allPacket += 1 if allPacket > 100 { - pingValue.lostRate = float64(lostPacket/allPacket) + pingValue.lostRate = float64(lostPacket/allPacket) * 100 } - pingValue.ping = uint64(diffTime/time.Millisecond) + if lostConnect { + pingValue.ping = 0 + } else { + pingValue.ping = uint64(diffTime/time.Millisecond) + } + lostConnect = false resetTime := uint64(time.Since(startTime) / time.Second) if resetTime > 3600 { lostPacket = 0 @@ -112,6 +138,7 @@ func (pingValue *PingValue) RunCM() { t := time.NewTicker(t1) var lostPacket = 0 var allPacket = 0 + var lostConnect = false startTime := time.Now() defaulttimeout := 1 * time.Second for { @@ -124,17 +151,28 @@ func (pingValue *PingValue) RunCM() { t := time.Now() conn , err := net.DialTimeout("tcp",CM_ADDR,defaulttimeout) if err != nil { - fmt.Println("Error try to connect China mobile :", err) + fmt.Println("[ping]Error try to connect China mobile :", err) + lostConnect = true lostPacket += 1 - return } - defer conn.Close() + tcpconn, ok := conn.(*net.TCPConn) + if ok { + tcpconn.SetLinger(0) + } + if conn != nil { + conn.Close() + } diffTime := time.Since(t) allPacket += 1 if allPacket > 100 { - pingValue.lostRate = float64(lostPacket/allPacket) + pingValue.lostRate = float64(lostPacket/allPacket) * 100 } - pingValue.ping = uint64(diffTime/time.Millisecond) + if lostConnect { + pingValue.ping = 0 + } else { + pingValue.ping = uint64(diffTime/time.Millisecond) + } + lostConnect = false resetTime := uint64(time.Since(startTime) / time.Second) if resetTime > 3600 { lostPacket = 0