|
|
|
@ -18,6 +18,7 @@ import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
"net"
|
|
|
|
|
"strconv"
|
|
|
|
|
"strings"
|
|
|
|
@ -35,6 +36,7 @@ import (
|
|
|
|
|
|
|
|
|
|
frpIo "github.com/fatedier/golib/io"
|
|
|
|
|
"github.com/fatedier/golib/pool"
|
|
|
|
|
fmux "github.com/hashicorp/yamux"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Visitor is used for forward traffics from local port tot remote service.
|
|
|
|
@ -280,6 +282,8 @@ func (sv *XtcpVisitor) handleConn(userConn frpNet.Conn) {
|
|
|
|
|
sv.Error("listen on visitorConn's local adress error: %v", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
defer lConn.Close()
|
|
|
|
|
|
|
|
|
|
lConn.SetReadDeadline(time.Now().Add(5 * time.Second))
|
|
|
|
|
sidBuf := pool.GetBuf(1024)
|
|
|
|
|
n, _, err = lConn.ReadFromUDP(sidBuf)
|
|
|
|
@ -314,7 +318,22 @@ func (sv *XtcpVisitor) handleConn(userConn frpNet.Conn) {
|
|
|
|
|
remote = frpIo.WithCompression(remote)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
frpIo.Join(userConn, remote)
|
|
|
|
|
fmuxCfg := fmux.DefaultConfig()
|
|
|
|
|
fmuxCfg.KeepAliveInterval = 5 * time.Second
|
|
|
|
|
fmuxCfg.LogOutput = ioutil.Discard
|
|
|
|
|
sess, err := fmux.Client(remote, fmuxCfg)
|
|
|
|
|
if err != nil {
|
|
|
|
|
sv.Error("create yamux session error: %v", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
defer sess.Close()
|
|
|
|
|
muxConn, err := sess.Open()
|
|
|
|
|
if err != nil {
|
|
|
|
|
sv.Error("open yamux stream error: %v", err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
frpIo.Join(userConn, muxConn)
|
|
|
|
|
sv.Debug("join connections closed")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|