Skip to content
Snippets Groups Projects
Commit 9c680987 authored by Bensong Liu's avatar Bensong Liu
Browse files

init

parent 7ab09824
No related branches found
No related tags found
No related merge requests found
telnet @ 744fe939
Subproject commit 744fe939337506a1fe3ccdec3027e08dbe1d364f
name = telnet-cli
build:
GOOS=windows GOARCH=amd64 go build -o $(name).win64.exe main.go
GOOS=windows GOARCH=386 go build -o $(name).win32.exe main.go
go build -o $(name).linux.bin main.go
package cmd
import (
"flag"
"github.com/assizkii/telnet/internal/client"
"github.com/assizkii/telnet/internal/server"
"log"
"time"
)
var (
timeoutFlag string
)
func init() {
flag.StringVar(&timeoutFlag, "timeout", "10s", "timeout durations")
flag.Parse()
}
func RunNetwork() {
host := flag.Arg(0)
port := flag.Arg(1)
networkType := flag.Arg(2)
// запускаем сервер
if networkType == "server" {
server.Start(server.Config{Host: host, Port: port})
} else {
timeout, err := time.ParseDuration(timeoutFlag)
if err != nil {
log.Fatalf("incorrect timeout")
}
// задаём конфиг клиента
var conf = client.Config{Host: host, Port: port, Timeout: timeout}
client.Start(conf)
}
}
module github.com/assizkii/telnet
go 1.13
package client
import (
"bufio"
"context"
"fmt"
"log"
"net"
"os"
"sync"
"time"
)
type Config struct {
Host string
Port string
Timeout time.Duration
}
func Start(conf Config) {
var timeout = conf.Timeout
dialer := &net.Dialer{
Timeout: timeout,
}
wg := &sync.WaitGroup{}
ctx, cancel := context.WithCancel(context.Background())
conn, err := dialer.DialContext(ctx, "tcp", conf.Host+":"+conf.Port)
if err != nil {
log.Fatalf("Cannot connect: %v", err)
}
wg.Add(1)
go func() {
readSocket(ctx, cancel, conn)
wg.Done()
}()
wg.Add(1)
go func() {
writeSocket(ctx, conn)
wg.Done()
}()
wg.Wait()
conn.Close()
}
func readSocket(ctx context.Context, cancel context.CancelFunc, conn net.Conn) {
scanner := bufio.NewScanner(conn)
for {
select {
case <-ctx.Done():
break
default:
if !scanner.Scan() {
cancel()
conn.Close()
log.Fatal("connection refused")
break
}
text := scanner.Text()
log.Printf("read from server %s", text)
}
}
log.Printf("finished reading")
}
func writeSocket(ctx context.Context, conn net.Conn) {
scanner := bufio.NewScanner(os.Stdin)
for {
select {
case <-ctx.Done():
break
default:
if !scanner.Scan() {
conn.Close()
log.Fatal("connection refused")
break
}
text := scanner.Text()
log.Printf("write to server %s", text)
conn.Write([]byte(fmt.Sprintf("%s\n", text)))
}
}
log.Printf("finished writing")
}
package server
import (
"bufio"
"fmt"
"log"
"net"
)
type Config struct {
Host string
Port string
}
func handleConnection(conn net.Conn) {
defer conn.Close()
conn.Write([]byte(fmt.Sprintf("Welcome to %s, friend from %s\n", conn.LocalAddr(), conn.RemoteAddr())))
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
text := scanner.Text()
log.Printf("RECEIVED: %s", text)
if text == "quit" || text == "exit" {
break
}
conn.Write([]byte(fmt.Sprintf("I have received '%s'\n", text)))
}
if err := scanner.Err(); err != nil {
log.Printf("Error happend on connection with %s: %v", conn.RemoteAddr(), err)
}
log.Printf("Closing connection with %s", conn.RemoteAddr())
}
func Start(conf Config) {
l, err := net.Listen("tcp", conf.Host+":"+conf.Port)
if err != nil {
log.Fatalf("Cannot listen: %v", err)
}
defer l.Close()
for {
conn, err := l.Accept()
if err != nil {
log.Fatalf("Cannot accept: %v", err)
}
go handleConnection(conn)
}
}
package main
import (
"github.com/assizkii/telnet/cmd"
)
func main() {
cmd.RunNetwork()
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment