init from svn

This commit is contained in:
zhangsz
2025-06-26 10:41:21 +08:00
parent 18339fa05c
commit 0f8e406da4
27 changed files with 3425 additions and 0 deletions

100
src/internal/telnet/tcp.go Executable file
View File

@@ -0,0 +1,100 @@
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()
}
}