mirror of
https://github.com/bolucat/Archive.git
synced 2025-10-10 10:32:53 +08:00
64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package transporter
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
|
|
"github.com/Ehco1996/ehco/internal/cmgr"
|
|
"github.com/Ehco1996/ehco/internal/constant"
|
|
"github.com/Ehco1996/ehco/internal/relay/conf"
|
|
"github.com/Ehco1996/ehco/pkg/lb"
|
|
)
|
|
|
|
// RelayTransporter
|
|
type RelayTransporter interface {
|
|
// UDP相关
|
|
GetOrCreateBufferCh(uaddr *net.UDPAddr) *BufferCh
|
|
HandleUDPConn(uaddr *net.UDPAddr, local *net.UDPConn)
|
|
|
|
// TCP相关
|
|
dialRemote(remote *lb.Node) (net.Conn, error)
|
|
HandleTCPConn(c net.Conn, remote *lb.Node) error
|
|
GetRemote() *lb.Node
|
|
}
|
|
|
|
func NewRelayTransporter(cfg *conf.Config, connMgr cmgr.Cmgr) RelayTransporter {
|
|
tcpNodeList := make([]*lb.Node, len(cfg.TCPRemotes))
|
|
for idx, addr := range cfg.TCPRemotes {
|
|
tcpNodeList[idx] = &lb.Node{
|
|
Address: addr,
|
|
Label: fmt.Sprintf("%s-%s", cfg.Label, addr),
|
|
}
|
|
}
|
|
udpNodeList := make([]*lb.Node, len(cfg.UDPRemotes))
|
|
for idx, addr := range cfg.UDPRemotes {
|
|
udpNodeList[idx] = &lb.Node{
|
|
Address: addr,
|
|
Label: fmt.Sprintf("%s-%s", cfg.Label, addr),
|
|
}
|
|
}
|
|
raw := newRaw(cfg.Label, lb.NewRoundRobin(tcpNodeList), lb.NewRoundRobin(udpNodeList), connMgr)
|
|
|
|
switch cfg.TransportType {
|
|
case constant.Transport_RAW:
|
|
return raw
|
|
case constant.Transport_WS:
|
|
return &Ws{Raw: raw}
|
|
case constant.Transport_WSS:
|
|
return &Wss{Raw: raw}
|
|
case constant.Transport_MWSS:
|
|
logger := raw.l.Named("MWSSClient")
|
|
mWSSClient := NewMWSSClient(logger)
|
|
mwss := &Mwss{mtp: NewSmuxTransporter(logger, mWSSClient.InitNewSession)}
|
|
mwss.Raw = raw
|
|
return mwss
|
|
case constant.Transport_MTCP:
|
|
logger := raw.l.Named("MTCPClient")
|
|
mTCPClient := NewMTCPClient(logger)
|
|
mtcp := &MTCP{mtp: NewSmuxTransporter(logger, mTCPClient.InitNewSession)}
|
|
mtcp.Raw = raw
|
|
return mtcp
|
|
}
|
|
return nil
|
|
}
|