mirror of
https://github.com/ehang-io/nps.git
synced 2025-09-02 03:16:53 +00:00
很多修改
This commit is contained in:
@@ -8,53 +8,47 @@ import (
|
||||
|
||||
//server base struct
|
||||
type server struct {
|
||||
bridge *bridge.Tunnel
|
||||
config *utils.ServerConfig
|
||||
bridge *bridge.Bridge
|
||||
task *utils.Tunnel
|
||||
config *utils.Config
|
||||
sync.Mutex
|
||||
}
|
||||
|
||||
func (s *server) GetTunnelAndWriteHost(connType string, cnf *utils.ServerConfig, addr string) (*utils.Conn, error) {
|
||||
var err error
|
||||
link, err := s.bridge.GetTunnel(cnf.ClientId, cnf.CompressEncode, cnf.CompressDecode, cnf.Crypt, cnf.Mux)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
func (s *server) GetTunnelAndWriteHost(connType string, clientId int, cnf *utils.Config, addr string) (link *utils.Conn, err error) {
|
||||
if link, err = s.bridge.GetTunnel(clientId, cnf.CompressEncode, cnf.CompressDecode, cnf.Crypt, cnf.Mux); err != nil {
|
||||
return
|
||||
}
|
||||
if _, err = link.WriteHost(connType, addr); err != nil {
|
||||
link.Close()
|
||||
return nil, err
|
||||
}
|
||||
return link, nil
|
||||
return
|
||||
}
|
||||
|
||||
func (s *server) FlowAdd(in, out int64) {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
if s.config.Flow == nil {
|
||||
s.config.Flow = new(utils.Flow)
|
||||
}
|
||||
s.config.Flow.ExportFlow += out
|
||||
s.config.Flow.InletFlow += in
|
||||
s.task.Flow.ExportFlow += out
|
||||
s.task.Flow.InletFlow += in
|
||||
}
|
||||
|
||||
func (s *server) FlowAddHost(host *utils.HostList, in, out int64) {
|
||||
func (s *server) FlowAddHost(host *utils.Host, in, out int64) {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
if s.config.Flow == nil {
|
||||
s.config.Flow = new(utils.Flow)
|
||||
}
|
||||
host.Flow.ExportFlow += out
|
||||
host.Flow.InletFlow += in
|
||||
}
|
||||
|
||||
//热更新配置
|
||||
func (s *server) ResetConfig() {
|
||||
task, err := CsvDb.GetTask(s.config.Id)
|
||||
//获取最新数据
|
||||
task, err := CsvDb.GetTask(s.task.Id)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
s.config.UseClientCnf = task.UseClientCnf
|
||||
if s.config.UseClientCnf {
|
||||
client, err := CsvDb.GetClient(s.config.ClientId)
|
||||
s.task.UseClientCnf = task.UseClientCnf
|
||||
//使用客户端配置
|
||||
if s.task.UseClientCnf {
|
||||
client, err := CsvDb.GetClient(s.task.Client.Id)
|
||||
if err == nil {
|
||||
s.config.U = client.Cnf.U
|
||||
s.config.P = client.Cnf.P
|
||||
@@ -62,15 +56,14 @@ func (s *server) ResetConfig() {
|
||||
s.config.Mux = client.Cnf.Mux
|
||||
s.config.Crypt = client.Cnf.Crypt
|
||||
}
|
||||
s.config.CompressDecode, s.config.CompressEncode = utils.GetCompressType(client.Cnf.Compress)
|
||||
} else {
|
||||
if err == nil {
|
||||
s.config.U = task.U
|
||||
s.config.P = task.P
|
||||
s.config.Compress = task.Compress
|
||||
s.config.Mux = task.Mux
|
||||
s.config.Crypt = task.Crypt
|
||||
s.config.U = task.Config.U
|
||||
s.config.P = task.Config.P
|
||||
s.config.Compress = task.Config.Compress
|
||||
s.config.Mux = task.Config.Mux
|
||||
s.config.Crypt = task.Config.Crypt
|
||||
}
|
||||
s.config.CompressDecode, s.config.CompressEncode = utils.GetCompressType(task.Compress)
|
||||
}
|
||||
s.config.CompressDecode, s.config.CompressEncode = utils.GetCompressType(s.config.Compress)
|
||||
}
|
||||
|
@@ -13,13 +13,7 @@ type process func(c *utils.Conn, s *TunnelModeServer) error
|
||||
|
||||
//tcp隧道模式
|
||||
func ProcessTunnel(c *utils.Conn, s *TunnelModeServer) error {
|
||||
_, _, rb, err, r := c.GetHost()
|
||||
if err == nil {
|
||||
if err := s.auth(r, c, s.config.U, s.config.P); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return s.dealClient(c, s.config, s.config.Target, "", rb)
|
||||
return s.dealClient(c, s.config, s.task.Target, "", nil)
|
||||
}
|
||||
|
||||
//http代理模式
|
||||
@@ -41,8 +35,7 @@ func ProcessHost(c *utils.Conn, s *TunnelModeServer) error {
|
||||
var (
|
||||
isConn = true
|
||||
link *utils.Conn
|
||||
client *utils.Client
|
||||
host *utils.HostList
|
||||
host *utils.Host
|
||||
wg sync.WaitGroup
|
||||
)
|
||||
for {
|
||||
@@ -52,17 +45,17 @@ func ProcessHost(c *utils.Conn, s *TunnelModeServer) error {
|
||||
}
|
||||
//首次获取conn
|
||||
if isConn {
|
||||
if host, client, err = GetKeyByHost(r.Host); err != nil {
|
||||
if host, err = GetInfoByHost(r.Host); err != nil {
|
||||
log.Printf("the host %s is not found !", r.Host)
|
||||
break
|
||||
}
|
||||
|
||||
client.Cnf.ClientId = host.ClientId
|
||||
client.Cnf.CompressDecode, client.Cnf.CompressEncode = utils.GetCompressType(client.Cnf.Compress)
|
||||
if err = s.auth(r, c, client.Cnf.U, client.Cnf.P); err != nil {
|
||||
host.Client.Cnf.CompressDecode, host.Client.Cnf.CompressEncode = utils.GetCompressType(host.Client.Cnf.Compress)
|
||||
|
||||
if err = s.auth(r, c, host.Client.Cnf.U, host.Client.Cnf.P); err != nil {
|
||||
break
|
||||
}
|
||||
if link, err = s.GetTunnelAndWriteHost(utils.CONN_TCP, client.Cnf, host.Target); err != nil {
|
||||
if link, err = s.GetTunnelAndWriteHost(utils.CONN_TCP, host.Client.Id, host.Client.Cnf, host.Target); err != nil {
|
||||
log.Println("get bridge tunnel error: ", err)
|
||||
break
|
||||
}
|
||||
@@ -72,27 +65,28 @@ func ProcessHost(c *utils.Conn, s *TunnelModeServer) error {
|
||||
} else {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
out, _ := utils.Relay(c.Conn, link.Conn, client.Cnf.CompressDecode, client.Cnf.Crypt, client.Cnf.Mux)
|
||||
out, _ := utils.Relay(c.Conn, link.Conn, host.Client.Cnf.CompressDecode, host.Client.Cnf.Crypt, host.Client.Cnf.Mux)
|
||||
wg.Done()
|
||||
s.FlowAddHost(host, 0, out)
|
||||
}()
|
||||
}
|
||||
isConn = false
|
||||
}
|
||||
//根据设定,修改header和host
|
||||
utils.ChangeHostAndHeader(r, host.HostChange, host.HeaderChange, c.Conn.RemoteAddr().String())
|
||||
b, err := httputil.DumpRequest(r, true)
|
||||
s.FlowAddHost(host, int64(len(b)), 0)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
if _, err := link.WriteTo(b, client.Cnf.CompressEncode, client.Cnf.Crypt); err != nil {
|
||||
s.FlowAddHost(host, int64(len(b)), 0)
|
||||
if _, err := link.WriteTo(b, host.Client.Cnf.CompressEncode, host.Client.Cnf.Crypt); err != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
wg.Wait()
|
||||
if client != nil && client.Cnf != nil && client.Cnf.Mux && link != nil {
|
||||
link.WriteTo([]byte(utils.IO_EOF), client.Cnf.CompressEncode, client.Cnf.Crypt)
|
||||
s.bridge.ReturnTunnel(link, client.Id)
|
||||
if host != nil && host.Client.Cnf != nil && host.Client.Cnf.Mux && link != nil {
|
||||
link.WriteTo([]byte(utils.IO_EOF), host.Client.Cnf.CompressEncode, host.Client.Cnf.Crypt)
|
||||
s.bridge.ReturnTunnel(link, host.Client.Id)
|
||||
} else if link != nil {
|
||||
link.Close()
|
||||
}
|
||||
@@ -103,5 +97,3 @@ func ProcessHost(c *utils.Conn, s *TunnelModeServer) error {
|
||||
c.Close()
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
|
@@ -20,10 +20,9 @@ type RunServer struct {
|
||||
}
|
||||
|
||||
var (
|
||||
Bridge *bridge.Tunnel
|
||||
Bridge *bridge.Bridge
|
||||
RunList map[int]interface{} //运行中的任务
|
||||
CsvDb = utils.GetCsvDb()
|
||||
VerifyKey string
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -33,7 +32,7 @@ func init() {
|
||||
//从csv文件中恢复任务
|
||||
func InitFromCsv() {
|
||||
for _, v := range CsvDb.Tasks {
|
||||
if v.Start == 1 {
|
||||
if v.Status {
|
||||
log.Println("启动模式:", v.Mode, "监听端口:", v.TcpPort)
|
||||
AddTask(v)
|
||||
}
|
||||
@@ -41,7 +40,7 @@ func InitFromCsv() {
|
||||
}
|
||||
|
||||
//start a new server
|
||||
func StartNewServer(bridgePort int, cnf *utils.ServerConfig) {
|
||||
func StartNewServer(bridgePort int, cnf *utils.Tunnel) {
|
||||
Bridge = bridge.NewTunnel(bridgePort, RunList)
|
||||
if err := Bridge.StartTunnel(); err != nil {
|
||||
log.Fatalln("服务端开启失败", err)
|
||||
@@ -58,37 +57,32 @@ func StartNewServer(bridgePort int, cnf *utils.ServerConfig) {
|
||||
}
|
||||
|
||||
//new a server by mode name
|
||||
func NewMode(Bridge *bridge.Tunnel, c *utils.ServerConfig) interface{} {
|
||||
config := utils.DeepCopyConfig(c)
|
||||
switch config.Mode {
|
||||
func NewMode(Bridge *bridge.Bridge, c *utils.Tunnel) interface{} {
|
||||
switch c.Mode {
|
||||
case "tunnelServer":
|
||||
return NewTunnelModeServer(ProcessTunnel, Bridge, config)
|
||||
return NewTunnelModeServer(ProcessTunnel, Bridge, c)
|
||||
case "socks5Server":
|
||||
return NewSock5ModeServer(Bridge, config)
|
||||
return NewSock5ModeServer(Bridge, c)
|
||||
case "httpProxyServer":
|
||||
return NewTunnelModeServer(ProcessHttp, Bridge, config)
|
||||
return NewTunnelModeServer(ProcessHttp, Bridge, c)
|
||||
case "udpServer":
|
||||
return NewUdpModeServer(Bridge, config)
|
||||
return NewUdpModeServer(Bridge, c)
|
||||
case "webServer":
|
||||
InitFromCsv()
|
||||
p, _ := beego.AppConfig.Int("hostPort")
|
||||
t := &utils.ServerConfig{
|
||||
TcpPort: p,
|
||||
Mode: "httpHostServer",
|
||||
Target: "",
|
||||
U: "",
|
||||
P: "",
|
||||
Compress: "",
|
||||
Start: 1,
|
||||
IsRun: 0,
|
||||
ClientStatus: 0,
|
||||
t := &utils.Tunnel{
|
||||
TcpPort: p,
|
||||
Mode: "httpHostServer",
|
||||
Target: "",
|
||||
Config: &utils.Config{},
|
||||
Status: true,
|
||||
}
|
||||
AddTask(t)
|
||||
return NewWebServer(Bridge)
|
||||
case "hostServer":
|
||||
return NewHostServer(config)
|
||||
return NewHostServer(c)
|
||||
case "httpHostServer":
|
||||
return NewTunnelModeServer(ProcessHost, Bridge, config)
|
||||
return NewTunnelModeServer(ProcessHost, Bridge, c)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -100,7 +94,7 @@ func StopServer(id int) error {
|
||||
if t, err := CsvDb.GetTask(id); err != nil {
|
||||
return err
|
||||
} else {
|
||||
t.Start = 0
|
||||
t.Status = false
|
||||
CsvDb.UpdateTask(t)
|
||||
}
|
||||
return nil
|
||||
@@ -109,7 +103,7 @@ func StopServer(id int) error {
|
||||
}
|
||||
|
||||
//add task
|
||||
func AddTask(t *utils.ServerConfig) error {
|
||||
func AddTask(t *utils.Tunnel) error {
|
||||
if svr := NewMode(Bridge, t); svr != nil {
|
||||
RunList[t.Id] = svr
|
||||
go func() {
|
||||
@@ -131,7 +125,7 @@ func StartTask(id int) error {
|
||||
return err
|
||||
} else {
|
||||
AddTask(t)
|
||||
t.Start = 1
|
||||
t.Status = true
|
||||
CsvDb.UpdateTask(t)
|
||||
}
|
||||
return nil
|
||||
@@ -146,12 +140,11 @@ func DelTask(id int) error {
|
||||
}
|
||||
|
||||
//get key by host from x
|
||||
func GetKeyByHost(host string) (h *utils.HostList, t *utils.Client, err error) {
|
||||
func GetInfoByHost(host string) (h *utils.Host, err error) {
|
||||
for _, v := range CsvDb.Hosts {
|
||||
s := strings.Split(host, ":")
|
||||
if s[0] == v.Host {
|
||||
h = v
|
||||
t, err = CsvDb.GetClient(v.ClientId)
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -160,39 +153,25 @@ func GetKeyByHost(host string) (h *utils.HostList, t *utils.Client, err error) {
|
||||
}
|
||||
|
||||
//get task list by page num
|
||||
func GetServerConfig(start, length int, typeVal string, clientId int) ([]*utils.ServerConfig, int) {
|
||||
list := make([]*utils.ServerConfig, 0)
|
||||
func GetTunnel(start, length int, typeVal string, clientId int) ([]*utils.Tunnel, int) {
|
||||
list := make([]*utils.Tunnel, 0)
|
||||
var cnt int
|
||||
for _, v := range CsvDb.Tasks {
|
||||
if (typeVal != "" && v.Mode != typeVal) || (typeVal == "" && clientId != v.ClientId) {
|
||||
if (typeVal != "" && v.Mode != typeVal) || (typeVal == "" && clientId != v.Client.Id) {
|
||||
continue
|
||||
}
|
||||
if v.UseClientCnf {
|
||||
v = utils.DeepCopyConfig(v)
|
||||
if c, err := CsvDb.GetClient(v.ClientId); err == nil {
|
||||
v.Compress = c.Cnf.Compress
|
||||
v.Mux = c.Cnf.Mux
|
||||
v.Crypt = c.Cnf.Crypt
|
||||
v.U = c.Cnf.U
|
||||
v.P = c.Cnf.P
|
||||
}
|
||||
}
|
||||
cnt++
|
||||
if _, ok := Bridge.SignalList[v.Client.Id]; ok {
|
||||
v.Client.IsConnect = true
|
||||
} else {
|
||||
v.Client.IsConnect = false
|
||||
}
|
||||
if start--; start < 0 {
|
||||
if length--; length > 0 {
|
||||
if _, ok := RunList[v.Id]; ok {
|
||||
v.IsRun = 1
|
||||
v.Client.Status = true
|
||||
} else {
|
||||
v.IsRun = 0
|
||||
}
|
||||
if s, ok := Bridge.SignalList[v.ClientId]; ok {
|
||||
if s.Len() > 0 {
|
||||
v.ClientStatus = 1
|
||||
} else {
|
||||
v.ClientStatus = 0
|
||||
}
|
||||
} else {
|
||||
v.ClientStatus = 0
|
||||
v.Client.Status = false
|
||||
}
|
||||
list = append(list, v)
|
||||
}
|
||||
@@ -218,13 +197,13 @@ func dealClientData(list []*utils.Client) {
|
||||
v.Flow.InletFlow = 0
|
||||
v.Flow.ExportFlow = 0
|
||||
for _, h := range CsvDb.Hosts {
|
||||
if h.ClientId == v.Id {
|
||||
if h.Client.Id == v.Id {
|
||||
v.Flow.InletFlow += h.Flow.InletFlow
|
||||
v.Flow.ExportFlow += h.Flow.ExportFlow
|
||||
}
|
||||
}
|
||||
for _, t := range CsvDb.Tasks {
|
||||
if t.ClientId == v.Id {
|
||||
if t.Client.Id == v.Id {
|
||||
v.Flow.InletFlow += t.Flow.InletFlow
|
||||
v.Flow.ExportFlow += t.Flow.ExportFlow
|
||||
}
|
||||
@@ -236,12 +215,12 @@ func dealClientData(list []*utils.Client) {
|
||||
//根据客户端id删除其所属的所有隧道和域名
|
||||
func DelTunnelAndHostByClientId(clientId int) {
|
||||
for _, v := range CsvDb.Tasks {
|
||||
if v.ClientId == clientId {
|
||||
if v.Client.Id == clientId {
|
||||
DelTask(v.Id)
|
||||
}
|
||||
}
|
||||
for _, v := range CsvDb.Hosts {
|
||||
if v.ClientId == clientId {
|
||||
if v.Client.Id == clientId {
|
||||
CsvDb.DelHost(v.Host)
|
||||
}
|
||||
}
|
||||
|
@@ -141,7 +141,7 @@ func (s *Sock5ModeServer) doConnect(c net.Conn, command uint8) (proxyConn *utils
|
||||
} else {
|
||||
ltype = utils.CONN_TCP
|
||||
}
|
||||
if proxyConn, err = s.GetTunnelAndWriteHost(ltype, s.config, addr); err != nil {
|
||||
if proxyConn, err = s.GetTunnelAndWriteHost(ltype, s.task.Client.Id, s.config, addr); err != nil {
|
||||
log.Println("get bridge tunnel error: ", err)
|
||||
return
|
||||
}
|
||||
@@ -160,7 +160,7 @@ func (s *Sock5ModeServer) handleConnect(c net.Conn) {
|
||||
proxyConn, err := s.doConnect(c, connectMethod)
|
||||
defer func() {
|
||||
if s.config.Mux && proxyConn != nil {
|
||||
s.bridge.ReturnTunnel(proxyConn, s.config.ClientId)
|
||||
s.bridge.ReturnTunnel(proxyConn, s.task.Client.Id)
|
||||
}
|
||||
}()
|
||||
if err != nil {
|
||||
@@ -198,7 +198,7 @@ func (s *Sock5ModeServer) handleUDP(c net.Conn) {
|
||||
proxyConn, err := s.doConnect(c, associateMethod)
|
||||
defer func() {
|
||||
if s.config.Mux && proxyConn != nil {
|
||||
s.bridge.ReturnTunnel(proxyConn, s.config.ClientId)
|
||||
s.bridge.ReturnTunnel(proxyConn, s.task.Client.Id)
|
||||
}
|
||||
}()
|
||||
if err != nil {
|
||||
@@ -285,7 +285,7 @@ func (s *Sock5ModeServer) Auth(c net.Conn) error {
|
||||
//start
|
||||
func (s *Sock5ModeServer) Start() error {
|
||||
var err error
|
||||
s.listener, err = net.Listen("tcp", ":"+strconv.Itoa(s.config.TcpPort))
|
||||
s.listener, err = net.Listen("tcp", ":"+strconv.Itoa(s.task.TcpPort))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -309,10 +309,11 @@ func (s *Sock5ModeServer) Close() error {
|
||||
}
|
||||
|
||||
//new
|
||||
func NewSock5ModeServer(bridge *bridge.Tunnel, cnf *utils.ServerConfig) *Sock5ModeServer {
|
||||
func NewSock5ModeServer(bridge *bridge.Bridge, task *utils.Tunnel) *Sock5ModeServer {
|
||||
s := new(Sock5ModeServer)
|
||||
s.bridge = bridge
|
||||
s.config = cnf
|
||||
s.task = task
|
||||
s.config = utils.DeepCopyConfig(task.Config)
|
||||
if s.config.U != "" && s.config.P != "" {
|
||||
s.isVerify = true
|
||||
} else {
|
||||
|
@@ -20,11 +20,12 @@ type TunnelModeServer struct {
|
||||
}
|
||||
|
||||
//tcp|http|host
|
||||
func NewTunnelModeServer(process process, bridge *bridge.Tunnel, cnf *utils.ServerConfig) *TunnelModeServer {
|
||||
func NewTunnelModeServer(process process, bridge *bridge.Bridge, task *utils.Tunnel) *TunnelModeServer {
|
||||
s := new(TunnelModeServer)
|
||||
s.bridge = bridge
|
||||
s.process = process
|
||||
s.config = cnf
|
||||
s.task = task
|
||||
s.config = utils.DeepCopyConfig(task.Config)
|
||||
return s
|
||||
}
|
||||
|
||||
@@ -34,7 +35,7 @@ func (s *TunnelModeServer) Start() error {
|
||||
if s.errorContent, err = utils.ReadAllFromFile(beego.AppPath + "/web/static/page/error.html"); err != nil {
|
||||
s.errorContent = []byte("easyProxy 404")
|
||||
}
|
||||
s.listener, err = net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), s.config.TcpPort, ""})
|
||||
s.listener, err = net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP("0.0.0.0"), s.task.TcpPort, ""})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -69,15 +70,15 @@ func (s *TunnelModeServer) writeConnFail(c net.Conn) {
|
||||
}
|
||||
|
||||
//与客户端建立通道
|
||||
func (s *TunnelModeServer) dealClient(c *utils.Conn, cnf *utils.ServerConfig, addr string, method string, rb []byte) error {
|
||||
func (s *TunnelModeServer) dealClient(c *utils.Conn, cnf *utils.Config, addr string, method string, rb []byte) error {
|
||||
var link *utils.Conn
|
||||
var err error
|
||||
defer func() {
|
||||
if cnf.Mux && link != nil {
|
||||
s.bridge.ReturnTunnel(link, cnf.ClientId)
|
||||
s.bridge.ReturnTunnel(link, s.task.Client.Id)
|
||||
}
|
||||
}()
|
||||
if link, err = s.GetTunnelAndWriteHost(utils.CONN_TCP, cnf, addr); err != nil {
|
||||
if link, err = s.GetTunnelAndWriteHost(utils.CONN_TCP, s.task.Client.Id, cnf, addr); err != nil {
|
||||
log.Println("get bridge tunnel error: ", err)
|
||||
return err
|
||||
}
|
||||
@@ -115,7 +116,7 @@ func (s *WebServer) Start() {
|
||||
}
|
||||
|
||||
//new
|
||||
func NewWebServer(bridge *bridge.Tunnel) *WebServer {
|
||||
func NewWebServer(bridge *bridge.Bridge) *WebServer {
|
||||
s := new(WebServer)
|
||||
s.bridge = bridge
|
||||
return s
|
||||
@@ -131,9 +132,10 @@ func (s *HostServer) Start() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewHostServer(cnf *utils.ServerConfig) *HostServer {
|
||||
func NewHostServer(task *utils.Tunnel) *HostServer {
|
||||
s := new(HostServer)
|
||||
s.config = cnf
|
||||
s.task = task
|
||||
s.config = utils.DeepCopyConfig(task.Config)
|
||||
return s
|
||||
}
|
||||
|
||||
|
@@ -15,18 +15,19 @@ type UdpModeServer struct {
|
||||
udpMap map[string]*utils.Conn
|
||||
}
|
||||
|
||||
func NewUdpModeServer(bridge *bridge.Tunnel, cnf *utils.ServerConfig) *UdpModeServer {
|
||||
func NewUdpModeServer(bridge *bridge.Bridge, task *utils.Tunnel) *UdpModeServer {
|
||||
s := new(UdpModeServer)
|
||||
s.bridge = bridge
|
||||
s.udpMap = make(map[string]*utils.Conn)
|
||||
s.config = cnf
|
||||
s.task = task
|
||||
s.config = utils.DeepCopyConfig(task.Config)
|
||||
return s
|
||||
}
|
||||
|
||||
//开始
|
||||
func (s *UdpModeServer) Start() error {
|
||||
var err error
|
||||
s.listener, err = net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), s.config.TcpPort, ""})
|
||||
s.listener, err = net.ListenUDP("udp", &net.UDPAddr{net.ParseIP("0.0.0.0"), s.task.TcpPort, ""})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -45,14 +46,14 @@ func (s *UdpModeServer) Start() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
//TODO:效率问题有待解决
|
||||
//TODO:效率问题有待解决--->建立稳定通道,重复利用,提高效率,下个版本
|
||||
func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
|
||||
conn, err := s.bridge.GetTunnel(s.config.ClientId, s.config.CompressEncode, s.config.CompressDecode, s.config.Crypt, s.config.Mux)
|
||||
conn, err := s.bridge.GetTunnel(s.task.Client.Id, s.config.CompressEncode, s.config.CompressDecode, s.config.Crypt, s.config.Mux)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
if _, err := conn.WriteHost(utils.CONN_UDP, s.config.Target); err != nil {
|
||||
if _, err := conn.WriteHost(utils.CONN_UDP, s.task.Target); err != nil {
|
||||
conn.Close()
|
||||
return
|
||||
}
|
||||
@@ -60,7 +61,7 @@ func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
|
||||
defer func() {
|
||||
if conn != nil && s.config.Mux {
|
||||
conn.WriteTo([]byte(utils.IO_EOF), s.config.CompressEncode, s.config.Crypt)
|
||||
s.bridge.ReturnTunnel(conn, s.config.ClientId)
|
||||
s.bridge.ReturnTunnel(conn, s.task.Client.Id)
|
||||
} else {
|
||||
conn.Close()
|
||||
}
|
||||
@@ -70,7 +71,6 @@ func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
|
||||
buf := utils.BufPoolUdp.Get().([]byte)
|
||||
out, err := conn.ReadFrom(buf, s.config.CompressDecode, s.config.Crypt)
|
||||
if err != nil || err == io.EOF {
|
||||
log.Println("revieve error:", err)
|
||||
return
|
||||
}
|
||||
s.listener.WriteToUDP(buf[:out], addr)
|
||||
|
Reference in New Issue
Block a user