101 lines
1.9 KiB
Go
Executable File
101 lines
1.9 KiB
Go
Executable File
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()
|
|
}
|
|
}
|