package dial import ( "fmt" "github.com/fatih/color" "net" "time" ) func PortDial(address, port, protocol string, timeout int) { red := color.New(color.FgRed).SprintFunc() yellow := color.New(color.FgYellow).SprintFunc() green := color.New(color.FgGreen).SprintFunc() blue := color.New(color.FgBlue).SprintFunc() ip := digIp(address) if ip == "" { fmt.Printf("%v ping: %v: Name or service not known\n", blue(protocol), red(address)) return } fmt.Printf("%v ping %v (%v) via port %v (timeout: %vs)...\n", blue(protocol), address, ip, port, timeout) dialTarget := ip + ":" + port for { startTime := time.Now() conn, err := net.DialTimeout(protocol, dialTarget, time.Duration(timeout)*time.Second) endTime := time.Now() elapsedTime := float64(endTime.Sub(startTime)) / float64(time.Millisecond) if err != nil { fmt.Printf("%s via %v:%v time=%v ms\n", red("TIMEOUT"), ip, port, elapsedTime) time.Sleep(time.Duration(timeout) * time.Second) } else { err := conn.Close() if err != nil { return } if elapsedTime <= 500 { fmt.Printf("%s via %v:%v time=%v ms\n", green("OK"), ip, port, elapsedTime) } else { fmt.Printf("%s via %v:%v time=%v ms\n", yellow("OK"), ip, port, elapsedTime) } time.Sleep(time.Duration(1) * time.Second) continue } } } func digIp(address string) string { ip, err := net.ResolveIPAddr("ip", address) if err != nil { return "" } return ip.String() }