package telnet import ( "fmt" "net" "strings" "time" ) var listener *net.TCPListener var clientNum int // Server - Init TCP Server func Run(addrStr string) { addr := fmt.Sprintf("[%s]:4100", addrStr) tcpAddr, err := net.ResolveTCPAddr("tcp", addr) if err != nil { fmt.Println("[Telnet] net.ResolveTCPAddr fail:", addr) return } listener, err := net.ListenTCP("tcp", tcpAddr) if err != nil { fmt.Println("[Telnet] failed to listen:", err) return } fmt.Println("[Telnet] Listen on", addr) go func() { for { conn, err := listener.Accept() if err != nil { fmt.Println(err.Error()) continue } else if clientNum >= 9 { fmt.Println("too many telnet request connection") conn.Close() continue } clientNum++ fmt.Println("[Telnet] A new Connection", clientNum) fmt.Println("[Telnet] TCP Accept from:", conn.RemoteAddr().String()) go start(conn) } }() } // Start - Start TCP read channel func start(conn net.Conn) { defer closeConnection(conn) conn.Write([]byte(help_menu)) conn.Write([]byte(prompt)) for { buffer := make([]byte, 128) conn.SetReadDeadline(time.Now().Add(time.Minute*10)) _, err := conn.Read(buffer) if err != nil { fmt.Println("[Telnet] Error", err) break } buf := string(buffer) pos := strings.Index(buf, "\n") if pos < 0 || pos > 127 { break } cmd := buf[:pos] sep := strings.Fields(cmd) if len(sep) <= 0 { conn.Write([]byte(prompt)) continue } if sep[0] == "help" { conn.Write([]byte(help_menu)) conn.Write([]byte(prompt)) continue } if sep[0] == "q" || sep[0] == "quit" { break } rsp := HandleTelnetRequest(sep) conn.Write([]byte(rsp)) conn.Write([]byte(prompt)) } } func closeConnection(conn net.Conn) { conn.Close() clientNum-- fmt.Printf("[Telnet] Now, %d connections is alive.\n", clientNum) } func Stop() { if listener != nil { listener.Close() } }