package main import ( "io" "log" "net" ) type TCP struct { config *Config } func NewTCPServer(c *Config) TCP { return TCP{config: c} } func (tcp TCP) Listen() error { ln, err := net.Listen("tcp", tcp.config.Listen) if err != nil { return err } defer ln.Close() for { conn, err := ln.Accept() if err != nil { return err } go func() { defer conn.Close() conn2, err := net.Dial("tcp", tcp.config.TCPProxy) if err != nil { log.Println(err) return } errc := make(chan error) go func() { _, err := io.Copy(conn, conn2) select { case errc <- err: default: } }() go func() { _, err := io.Copy(conn2, conn) select { case errc <- err: default: } }() <-errc }() } }