diff --git a/CHANGELOG b/CHANGELOG index 7f20521..6e3376b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,8 @@ proxy更新日志 +v3.7 +1.修复了socks代理不能正常和上级代理通讯的问题. + + v3.6 1.http(s),socks代理,集成了外部HTTP API认证,可以通过外部API对用户名和密码进行认证. 2.手册http(s),socks代理认证部分增加了集成外部HTTP API认证的使用说明. diff --git a/README.md b/README.md index eed9f88..89b982f 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Proxy是golang实现的高性能http,https,websocket,tcp,udp,socks5代理服务 - ...   -本页是v3.6手册,其他版本手册请点击下面链接查看. +本页是v3.6-v3.7手册,其他版本手册请点击下面链接查看. - [v3.5手册](https://github.com/snail007/goproxy/tree/v3.5) - [v3.4手册](https://github.com/snail007/goproxy/tree/v3.4) - [v3.3手册](https://github.com/snail007/goproxy/tree/v3.3) @@ -122,7 +122,7 @@ wget https://github.com/reddec/monexec/releases/download/v0.1.1/monexec_0.1.1_li 下载地址:https://github.com/snail007/goproxy/releases ```shell cd /root/proxy/ -wget https://github.com/snail007/goproxy/releases/download/v3.6/proxy-linux-amd64.tar.gz +wget https://github.com/snail007/goproxy/releases/download/v3.7/proxy-linux-amd64.tar.gz ``` #### **3.下载自动安装脚本** ```shell diff --git a/config.go b/config.go index 0c9d939..d2eec51 100755 --- a/config.go +++ b/config.go @@ -102,6 +102,7 @@ func initConfig() (err error) { tunnelServerArgs.IsUDP = tunnelServer.Flag("udp", "proxy on udp tunnel server mode").Default("false").Bool() tunnelServerArgs.Key = tunnelServer.Flag("k", "client key").Default("default").String() tunnelServerArgs.Route = tunnelServer.Flag("route", "local route to client's network, such as :PROTOCOL://LOCAL_IP:LOCAL_PORT@[CLIENT_KEY]CLIENT_LOCAL_HOST:CLIENT_LOCAL_PORT").Short('r').Default("").Strings() + tunnelServerArgs.Mux = tunnelServer.Flag("mux", "use multiplexing mode").Default("false").Bool() //########tunnel-client######### tunnelClient := app.Command("tclient", "proxy on tunnel client mode") @@ -110,6 +111,7 @@ func initConfig() (err error) { tunnelClientArgs.KeyFile = tunnelClient.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() tunnelClientArgs.Timeout = tunnelClient.Flag("timeout", "tcp timeout with milliseconds").Short('t').Default("2000").Int() tunnelClientArgs.Key = tunnelClient.Flag("k", "key same with server").Default("default").String() + tunnelClientArgs.Mux = tunnelClient.Flag("mux", "use multiplexing mode").Default("false").Bool() //########tunnel-bridge######### tunnelBridge := app.Command("tbridge", "proxy on tunnel bridge mode") @@ -117,6 +119,7 @@ func initConfig() (err error) { tunnelBridgeArgs.KeyFile = tunnelBridge.Flag("key", "key file for tls").Short('K').Default("proxy.key").String() tunnelBridgeArgs.Timeout = tunnelBridge.Flag("timeout", "tcp timeout with milliseconds").Short('t').Default("2000").Int() tunnelBridgeArgs.Local = tunnelBridge.Flag("local", "local ip:port to listen").Short('p').Default(":33080").String() + tunnelBridgeArgs.Mux = tunnelBridge.Flag("mux", "use multiplexing mode").Default("false").Bool() //########ssh######### socks := app.Command("socks", "proxy on ssh mode") diff --git a/install_auto.sh b/install_auto.sh index d29444d..9993b06 100755 --- a/install_auto.sh +++ b/install_auto.sh @@ -6,7 +6,7 @@ fi mkdir /tmp/proxy cd /tmp/proxy wget https://github.com/reddec/monexec/releases/download/v0.1.1/monexec_0.1.1_linux_amd64.tar.gz -wget https://github.com/snail007/goproxy/releases/download/v3.6/proxy-linux-amd64.tar.gz +wget https://github.com/snail007/goproxy/releases/download/v3.7/proxy-linux-amd64.tar.gz # install monexec tar zxvf monexec_0.1.1_linux_amd64.tar.gz diff --git a/main.go b/main.go index 5e47893..28b3019 100644 --- a/main.go +++ b/main.go @@ -9,7 +9,7 @@ import ( "syscall" ) -const APP_VERSION = "3.6" +const APP_VERSION = "3.7" func main() { err := initConfig() diff --git a/release.sh b/release.sh index ac3eae4..d58d3cc 100755 --- a/release.sh +++ b/release.sh @@ -1,5 +1,5 @@ #!/bin/bash -VER="3.6" +VER="3.7" RELEASE="release-${VER}" rm -rf .cert mkdir .cert diff --git a/services/args.go b/services/args.go index 100d23c..a1e732c 100644 --- a/services/args.go +++ b/services/args.go @@ -16,6 +16,8 @@ const ( CONN_SERVER_HEARBEAT = uint8(3) CONN_SERVER = uint8(4) CONN_CLIENT = uint8(5) + CONN_SERVER_MUX = uint8(6) + CONN_CLIENT_MUX = uint8(7) ) type TunnelServerArgs struct { @@ -31,6 +33,7 @@ type TunnelServerArgs struct { Timeout *int Route *[]string Mgr *TunnelServerManager + Mux *bool } type TunnelClientArgs struct { Parent *string @@ -40,6 +43,7 @@ type TunnelClientArgs struct { KeyBytes []byte Key *string Timeout *int + Mux *bool } type TunnelBridgeArgs struct { Parent *string @@ -49,6 +53,7 @@ type TunnelBridgeArgs struct { KeyBytes []byte Local *string Timeout *int + Mux *bool } type TCPArgs struct { Parent *string diff --git a/services/socks.go b/services/socks.go index 9953666..a29aebd 100644 --- a/services/socks.go +++ b/services/socks.go @@ -492,11 +492,11 @@ func (s *Socks) getOutConn(methodBytes, reqBytes []byte, host string) (outConn n err = fmt.Errorf("write req detail fail,%s", err) return } - // _, err = outConn.Read(buf) - // if err != nil { - // err = fmt.Errorf("read req reply fail,%s", err) - // return - // } + _, err = outConn.Read(buf) + if err != nil { + err = fmt.Errorf("read req reply fail,%s", err) + return + } //result := buf[:n] //log.Printf("result:%v", result) diff --git a/services/tunnel_bridge.go b/services/tunnel_bridge.go index bc70886..8f043d8 100644 --- a/services/tunnel_bridge.go +++ b/services/tunnel_bridge.go @@ -17,8 +17,8 @@ type TunnelBridge struct { cfg TunnelBridgeArgs serverConns utils.ConcurrentMap clientControlConns utils.ConcurrentMap - cmServer utils.ConnManager - cmClient utils.ConnManager + // cmServer utils.ConnManager + // cmClient utils.ConnManager } func NewTunnelBridge() Service { @@ -26,8 +26,8 @@ func NewTunnelBridge() Service { cfg: TunnelBridgeArgs{}, serverConns: utils.NewConcurrentMap(), clientControlConns: utils.NewConcurrentMap(), - cmServer: utils.NewConnManager(), - cmClient: utils.NewConnManager(), + // cmServer: utils.NewConnManager(), + // cmClient: utils.NewConnManager(), } } @@ -92,7 +92,7 @@ func (s *TunnelBridge) Start(args interface{}) (err error) { time.Sleep(time.Second * 3) continue } else { - s.cmServer.Add(serverID, ID, &inConn) + // s.cmServer.Add(serverID, ID, &inConn) break } } @@ -114,11 +114,11 @@ func (s *TunnelBridge) Start(args interface{}) (err error) { serverConn := serverConnItem.(ServerConn).Conn utils.IoBind(*serverConn, inConn, func(err interface{}) { s.serverConns.Remove(ID) - s.cmClient.RemoveOne(key, ID) - s.cmServer.RemoveOne(serverID, ID) + // s.cmClient.RemoveOne(key, ID) + // s.cmServer.RemoveOne(serverID, ID) log.Printf("conn %s released", ID) }) - s.cmClient.Add(key, ID, &inConn) + // s.cmClient.Add(key, ID, &inConn) log.Printf("conn %s created", ID) case CONN_CLIENT_CONTROL: @@ -136,101 +136,101 @@ func (s *TunnelBridge) Start(args interface{}) (err error) { s.clientControlConns.Set(key, &inConn) log.Printf("set client %s control conn", key) - case CONN_SERVER_HEARBEAT: - var serverID string - err = utils.ReadPacketData(reader, &serverID) - if err != nil { - log.Printf("read error,ERR:%s", err) - return - } - log.Printf("server heartbeat connection, id: %s", serverID) - writeDie := make(chan bool) - readDie := make(chan bool) - go func() { - for { - inConn.SetWriteDeadline(time.Now().Add(time.Second * 3)) - _, err = inConn.Write([]byte{0x00}) - inConn.SetWriteDeadline(time.Time{}) - if err != nil { - log.Printf("server heartbeat connection write err %s", err) - break - } - time.Sleep(time.Second * 3) - } - close(writeDie) - }() - go func() { - for { - signal := make([]byte, 1) - inConn.SetReadDeadline(time.Now().Add(time.Second * 6)) - _, err := inConn.Read(signal) - inConn.SetReadDeadline(time.Time{}) - if err != nil { - log.Printf("server heartbeat connection read err: %s", err) - break - } else { - // log.Printf("heartbeat from server ,id:%s", serverID) - } - } - close(readDie) - }() - select { - case <-readDie: - case <-writeDie: - } - utils.CloseConn(&inConn) - s.cmServer.Remove(serverID) - log.Printf("server heartbeat conn %s released", serverID) - case CONN_CLIENT_HEARBEAT: - var clientID string - err = utils.ReadPacketData(reader, &clientID) - if err != nil { - log.Printf("read error,ERR:%s", err) - return - } - log.Printf("client heartbeat connection, id: %s", clientID) - writeDie := make(chan bool) - readDie := make(chan bool) - go func() { - for { - inConn.SetWriteDeadline(time.Now().Add(time.Second * 3)) - _, err = inConn.Write([]byte{0x00}) - inConn.SetWriteDeadline(time.Time{}) - if err != nil { - log.Printf("client heartbeat connection write err %s", err) - break - } - time.Sleep(time.Second * 3) - } - close(writeDie) - }() - go func() { - for { - signal := make([]byte, 1) - inConn.SetReadDeadline(time.Now().Add(time.Second * 6)) - _, err := inConn.Read(signal) - inConn.SetReadDeadline(time.Time{}) - if err != nil { - log.Printf("client control connection read err: %s", err) - break - } else { - // log.Printf("heartbeat from client ,id:%s", clientID) - } - } - close(readDie) - }() - select { - case <-readDie: - case <-writeDie: - } - utils.CloseConn(&inConn) - s.cmClient.Remove(clientID) - if s.clientControlConns.Has(clientID) { - item, _ := s.clientControlConns.Get(clientID) - (*item.(*net.Conn)).Close() - } - s.clientControlConns.Remove(clientID) - log.Printf("client heartbeat conn %s released", clientID) + // case CONN_SERVER_HEARBEAT: + // var serverID string + // err = utils.ReadPacketData(reader, &serverID) + // if err != nil { + // log.Printf("read error,ERR:%s", err) + // return + // } + // log.Printf("server heartbeat connection, id: %s", serverID) + // writeDie := make(chan bool) + // readDie := make(chan bool) + // go func() { + // for { + // inConn.SetWriteDeadline(time.Now().Add(time.Second * 3)) + // _, err = inConn.Write([]byte{0x00}) + // inConn.SetWriteDeadline(time.Time{}) + // if err != nil { + // log.Printf("server heartbeat connection write err %s", err) + // break + // } + // time.Sleep(time.Second * 3) + // } + // close(writeDie) + // }() + // go func() { + // for { + // signal := make([]byte, 1) + // inConn.SetReadDeadline(time.Now().Add(time.Second * 6)) + // _, err := inConn.Read(signal) + // inConn.SetReadDeadline(time.Time{}) + // if err != nil { + // log.Printf("server heartbeat connection read err: %s", err) + // break + // } else { + // // log.Printf("heartbeat from server ,id:%s", serverID) + // } + // } + // close(readDie) + // }() + // select { + // case <-readDie: + // case <-writeDie: + // } + // utils.CloseConn(&inConn) + // s.cmServer.Remove(serverID) + // log.Printf("server heartbeat conn %s released", serverID) + // case CONN_CLIENT_HEARBEAT: + // var clientID string + // err = utils.ReadPacketData(reader, &clientID) + // if err != nil { + // log.Printf("read error,ERR:%s", err) + // return + // } + // log.Printf("client heartbeat connection, id: %s", clientID) + // writeDie := make(chan bool) + // readDie := make(chan bool) + // go func() { + // for { + // inConn.SetWriteDeadline(time.Now().Add(time.Second * 3)) + // _, err = inConn.Write([]byte{0x00}) + // inConn.SetWriteDeadline(time.Time{}) + // if err != nil { + // log.Printf("client heartbeat connection write err %s", err) + // break + // } + // time.Sleep(time.Second * 3) + // } + // close(writeDie) + // }() + // go func() { + // for { + // signal := make([]byte, 1) + // inConn.SetReadDeadline(time.Now().Add(time.Second * 6)) + // _, err := inConn.Read(signal) + // inConn.SetReadDeadline(time.Time{}) + // if err != nil { + // log.Printf("client control connection read err: %s", err) + // break + // } else { + // // log.Printf("heartbeat from client ,id:%s", clientID) + // } + // } + // close(readDie) + // }() + // select { + // case <-readDie: + // case <-writeDie: + // } + // utils.CloseConn(&inConn) + // s.cmClient.Remove(clientID) + // if s.clientControlConns.Has(clientID) { + // item, _ := s.clientControlConns.Get(clientID) + // (*item.(*net.Conn)).Close() + // } + // s.clientControlConns.Remove(clientID) + // log.Printf("client heartbeat conn %s released", clientID) } }) if err != nil { diff --git a/services/tunnel_client.go b/services/tunnel_client.go index b06a5a7..7b1b3d6 100644 --- a/services/tunnel_client.go +++ b/services/tunnel_client.go @@ -11,79 +11,80 @@ import ( ) type TunnelClient struct { - cfg TunnelClientArgs - cm utils.ConnManager + cfg TunnelClientArgs + // cm utils.ConnManager ctrlConn net.Conn } func NewTunnelClient() Service { return &TunnelClient{ cfg: TunnelClientArgs{}, - cm: utils.NewConnManager(), + // cm: utils.NewConnManager(), } } func (s *TunnelClient) InitService() { - s.InitHeartbeatDeamon() + // s.InitHeartbeatDeamon() } -func (s *TunnelClient) InitHeartbeatDeamon() { - log.Printf("heartbeat started") - go func() { - var heartbeatConn net.Conn - var ID = *s.cfg.Key - for { - //close all connection - s.cm.RemoveAll() - if s.ctrlConn != nil { - s.ctrlConn.Close() - } - utils.CloseConn(&heartbeatConn) - heartbeatConn, err := s.GetInConn(CONN_CLIENT_HEARBEAT, ID) - if err != nil { - log.Printf("heartbeat connection err: %s, retrying...", err) - time.Sleep(time.Second * 3) - utils.CloseConn(&heartbeatConn) - continue - } - log.Printf("heartbeat connection created,id:%s", ID) - writeDie := make(chan bool) - readDie := make(chan bool) - go func() { - for { - heartbeatConn.SetWriteDeadline(time.Now().Add(time.Second * 3)) - _, err = heartbeatConn.Write([]byte{0x00}) - heartbeatConn.SetWriteDeadline(time.Time{}) - if err != nil { - log.Printf("heartbeat connection write err %s", err) - break - } - time.Sleep(time.Second * 3) - } - close(writeDie) - }() - go func() { - for { - signal := make([]byte, 1) - heartbeatConn.SetReadDeadline(time.Now().Add(time.Second * 6)) - _, err := heartbeatConn.Read(signal) - heartbeatConn.SetReadDeadline(time.Time{}) - if err != nil { - log.Printf("heartbeat connection read err: %s", err) - break - } else { - //log.Printf("heartbeat from bridge") - } - } - close(readDie) - }() - select { - case <-readDie: - case <-writeDie: - } - } - }() -} +// func (s *TunnelClient) InitHeartbeatDeamon() { +// log.Printf("heartbeat started") +// go func() { +// var heartbeatConn net.Conn +// var ID = *s.cfg.Key +// for { + +// //close all connection +// s.cm.RemoveAll() +// if s.ctrlConn != nil { +// s.ctrlConn.Close() +// } +// utils.CloseConn(&heartbeatConn) +// heartbeatConn, err := s.GetInConn(CONN_CLIENT_HEARBEAT, ID) +// if err != nil { +// log.Printf("heartbeat connection err: %s, retrying...", err) +// time.Sleep(time.Second * 3) +// utils.CloseConn(&heartbeatConn) +// continue +// } +// log.Printf("heartbeat connection created,id:%s", ID) +// writeDie := make(chan bool) +// readDie := make(chan bool) +// go func() { +// for { +// heartbeatConn.SetWriteDeadline(time.Now().Add(time.Second * 3)) +// _, err = heartbeatConn.Write([]byte{0x00}) +// heartbeatConn.SetWriteDeadline(time.Time{}) +// if err != nil { +// log.Printf("heartbeat connection write err %s", err) +// break +// } +// time.Sleep(time.Second * 3) +// } +// close(writeDie) +// }() +// go func() { +// for { +// signal := make([]byte, 1) +// heartbeatConn.SetReadDeadline(time.Now().Add(time.Second * 6)) +// _, err := heartbeatConn.Read(signal) +// heartbeatConn.SetReadDeadline(time.Time{}) +// if err != nil { +// log.Printf("heartbeat connection read err: %s", err) +// break +// } else { +// //log.Printf("heartbeat from bridge") +// } +// } +// close(readDie) +// }() +// select { +// case <-readDie: +// case <-writeDie: +// } +// } +// }() +// } func (s *TunnelClient) CheckArgs() { if *s.cfg.Parent != "" { log.Printf("use tls parent %s", *s.cfg.Parent) @@ -96,7 +97,7 @@ func (s *TunnelClient) CheckArgs() { s.cfg.CertBytes, s.cfg.KeyBytes = utils.TlsBytes(*s.cfg.CertFile, *s.cfg.KeyFile) } func (s *TunnelClient) StopService() { - s.cm.RemoveAll() + // s.cm.RemoveAll() } func (s *TunnelClient) Start(args interface{}) (err error) { s.cfg = args.(TunnelClientArgs) @@ -106,7 +107,7 @@ func (s *TunnelClient) Start(args interface{}) (err error) { for { //close all conn - s.cm.Remove(*s.cfg.Key) + // s.cm.Remove(*s.cfg.Key) if s.ctrlConn != nil { s.ctrlConn.Close() } @@ -171,7 +172,7 @@ func (s *TunnelClient) ServeUDP(localAddr, ID, serverID string) { var err error // for { for { - s.cm.RemoveOne(*s.cfg.Key, ID) + // s.cm.RemoveOne(*s.cfg.Key, ID) inConn, err = s.GetInConn(CONN_CLIENT, *s.cfg.Key, ID, serverID) if err != nil { utils.CloseConn(&inConn) @@ -182,7 +183,7 @@ func (s *TunnelClient) ServeUDP(localAddr, ID, serverID string) { break } } - s.cm.Add(*s.cfg.Key, ID, &inConn) + // s.cm.Add(*s.cfg.Key, ID, &inConn) log.Printf("conn %s created", ID) for { @@ -275,8 +276,8 @@ func (s *TunnelClient) ServeConn(localAddr, ID, serverID string) { } utils.IoBind(inConn, outConn, func(err interface{}) { log.Printf("conn %s released", ID) - s.cm.RemoveOne(*s.cfg.Key, ID) + // s.cm.RemoveOne(*s.cfg.Key, ID) }) - s.cm.Add(*s.cfg.Key, ID, &inConn) + // s.cm.Add(*s.cfg.Key, ID, &inConn) log.Printf("conn %s created", ID) } diff --git a/services/tunnel_server.go b/services/tunnel_server.go index d267fa9..252a7d3 100644 --- a/services/tunnel_server.go +++ b/services/tunnel_server.go @@ -24,7 +24,7 @@ type TunnelServerManager struct { udpChn chan UDPItem sc utils.ServerChannel serverID string - cm utils.ConnManager + // cm utils.ConnManager } func NewTunnelServerManager() Service { @@ -32,7 +32,7 @@ func NewTunnelServerManager() Service { cfg: TunnelServerArgs{}, udpChn: make(chan UDPItem, 50000), serverID: utils.Uniqueid(), - cm: utils.NewConnManager(), + // cm: utils.NewConnManager(), } } func (s *TunnelServerManager) Start(args interface{}) (err error) { @@ -91,7 +91,7 @@ func (s *TunnelServerManager) Clean() { s.StopService() } func (s *TunnelServerManager) StopService() { - s.cm.RemoveAll() + // s.cm.RemoveAll() } func (s *TunnelServerManager) CheckArgs() { if *s.cfg.CertFile == "" || *s.cfg.KeyFile == "" { @@ -100,62 +100,63 @@ func (s *TunnelServerManager) CheckArgs() { s.cfg.CertBytes, s.cfg.KeyBytes = utils.TlsBytes(*s.cfg.CertFile, *s.cfg.KeyFile) } func (s *TunnelServerManager) InitService() { - s.InitHeartbeatDeamon() -} -func (s *TunnelServerManager) InitHeartbeatDeamon() { - log.Printf("heartbeat started") - go func() { - var heartbeatConn net.Conn - var ID string - for { - //close all connection - s.cm.Remove(ID) - utils.CloseConn(&heartbeatConn) - heartbeatConn, ID, err := s.GetOutConn(CONN_SERVER_HEARBEAT) - if err != nil { - log.Printf("heartbeat connection err: %s, retrying...", err) - time.Sleep(time.Second * 3) - utils.CloseConn(&heartbeatConn) - continue - } - log.Printf("heartbeat connection created,id:%s", ID) - writeDie := make(chan bool) - readDie := make(chan bool) - go func() { - for { - heartbeatConn.SetWriteDeadline(time.Now().Add(time.Second * 3)) - _, err = heartbeatConn.Write([]byte{0x00}) - heartbeatConn.SetWriteDeadline(time.Time{}) - if err != nil { - log.Printf("heartbeat connection write err %s", err) - break - } - time.Sleep(time.Second * 3) - } - close(writeDie) - }() - go func() { - for { - signal := make([]byte, 1) - heartbeatConn.SetReadDeadline(time.Now().Add(time.Second * 6)) - _, err := heartbeatConn.Read(signal) - heartbeatConn.SetReadDeadline(time.Time{}) - if err != nil { - log.Printf("heartbeat connection read err: %s", err) - break - } else { - // log.Printf("heartbeat from bridge") - } - } - close(readDie) - }() - select { - case <-readDie: - case <-writeDie: - } - } - }() + // s.InitHeartbeatDeamon() } + +// func (s *TunnelServerManager) InitHeartbeatDeamon() { +// log.Printf("heartbeat started") +// go func() { +// var heartbeatConn net.Conn +// var ID string +// for { +// //close all connection +// s.cm.Remove(ID) +// utils.CloseConn(&heartbeatConn) +// heartbeatConn, ID, err := s.GetOutConn(CONN_SERVER_HEARBEAT) +// if err != nil { +// log.Printf("heartbeat connection err: %s, retrying...", err) +// time.Sleep(time.Second * 3) +// utils.CloseConn(&heartbeatConn) +// continue +// } +// log.Printf("heartbeat connection created,id:%s", ID) +// writeDie := make(chan bool) +// readDie := make(chan bool) +// go func() { +// for { +// heartbeatConn.SetWriteDeadline(time.Now().Add(time.Second * 3)) +// _, err = heartbeatConn.Write([]byte{0x00}) +// heartbeatConn.SetWriteDeadline(time.Time{}) +// if err != nil { +// log.Printf("heartbeat connection write err %s", err) +// break +// } +// time.Sleep(time.Second * 3) +// } +// close(writeDie) +// }() +// go func() { +// for { +// signal := make([]byte, 1) +// heartbeatConn.SetReadDeadline(time.Now().Add(time.Second * 6)) +// _, err := heartbeatConn.Read(signal) +// heartbeatConn.SetReadDeadline(time.Time{}) +// if err != nil { +// log.Printf("heartbeat connection read err: %s", err) +// break +// } else { +// // log.Printf("heartbeat from bridge") +// } +// } +// close(readDie) +// }() +// select { +// case <-readDie: +// case <-writeDie: +// } +// } +// }() +// } func (s *TunnelServerManager) GetOutConn(typ uint8) (outConn net.Conn, ID string, err error) { outConn, err = s.GetConn() if err != nil { @@ -241,11 +242,11 @@ func (s *TunnelServer) Start(args interface{}) (err error) { } } utils.IoBind(inConn, outConn, func(err interface{}) { - s.cfg.Mgr.cm.RemoveOne(s.cfg.Mgr.serverID, ID) + // s.cfg.Mgr.cm.RemoveOne(s.cfg.Mgr.serverID, ID) log.Printf("%s conn %s released", *s.cfg.Key, ID) }) //add conn - s.cfg.Mgr.cm.Add(s.cfg.Mgr.serverID, ID, &inConn) + // s.cfg.Mgr.cm.Add(s.cfg.Mgr.serverID, ID, &inConn) log.Printf("%s conn %s created", *s.cfg.Key, ID) }) if err != nil { diff --git a/utils/functions.go b/utils/functions.go index 6718002..3698184 100755 --- a/utils/functions.go +++ b/utils/functions.go @@ -42,7 +42,8 @@ func IoBind(dst io.ReadWriteCloser, src io.ReadWriteCloser, fn func(err interfac log.Printf("bind crashed %s", err) } }() - _, err := io.Copy(dst, src) + //_, err := io.Copy(dst, src) + err := ioCopy(dst, src) e1 <- err }() go func() { @@ -51,7 +52,8 @@ func IoBind(dst io.ReadWriteCloser, src io.ReadWriteCloser, fn func(err interfac log.Printf("bind crashed %s", err) } }() - _, err := io.Copy(src, dst) + //_, err := io.Copy(src, dst) + err := ioCopy(src, dst) e2 <- err }() var err interface{}