init from svn
This commit is contained in:
100
src/internal/telnet/tcp.go
Executable file
100
src/internal/telnet/tcp.go
Executable 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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user