diff --git a/gost/examples/bench/srv.go b/gost/examples/bench/srv.go index 7ad4573..4c3e0a3 100644 --- a/gost/examples/bench/srv.go +++ b/gost/examples/bench/srv.go @@ -34,8 +34,8 @@ func main() { go wsServer() go wssServer() go kcpServer() - // go tcpForwardServer() - // go rtcpForwardServer() + go tcpForwardServer() + go tcpRemoteForwardServer() // go rudpForwardServer() // go tcpRedirectServer() go sshTunnelServer() @@ -138,29 +138,32 @@ func tcpForwardServer() { log.Fatal(s.Serve(ln, h)) } -func rtcpForwardServer() { +func tcpRemoteForwardServer() { s := &gost.Server{} ln, err := gost.TCPRemoteForwardListener( ":1222", - gost.NewChain( - gost.Node{ - Protocol: "socks5", - Transport: "tcp", - Addr: "localhost:12345", - User: url.UserPassword("admin", "123456"), - Client: &gost.Client{ - Connector: gost.SOCKS5Connector(url.UserPassword("admin", "123456")), - Transporter: gost.TCPTransporter(), + /* + gost.NewChain( + gost.Node{ + Protocol: "socks5", + Transport: "tcp", + Addr: "localhost:12345", + User: url.UserPassword("admin", "123456"), + Client: &gost.Client{ + Connector: gost.SOCKS5Connector(url.UserPassword("admin", "123456")), + Transporter: gost.TCPTransporter(), + }, }, - }, - ), + ), + */ + nil, ) if err != nil { log.Fatal() } h := gost.TCPRemoteForwardHandler( - ":1222", - gost.AddrHandlerOption("127.0.0.1:22"), + ":22", + //gost.AddrHandlerOption("127.0.0.1:22"), ) log.Fatal(s.Serve(ln, h)) } diff --git a/gost/forward.go b/gost/forward.go index 1cd24e0..9763a88 100644 --- a/gost/forward.go +++ b/gost/forward.go @@ -405,6 +405,7 @@ func (c *udpServerConn) SetWriteDeadline(t time.Time) error { type tcpRemoteForwardListener struct { addr net.Addr chain *Chain + ln net.Listener closed chan struct{} } @@ -463,7 +464,13 @@ func (l *tcpRemoteForwardListener) accept() (conn net.Conn, err error) { cc.Close() } } else { - err = errors.New("invalid chain") + if l.ln == nil { + l.ln, err = net.Listen("tcp", l.addr.String()) + if err != nil { + return + } + } + conn, err = l.ln.Accept() } return }