From 7e2e63137ec157cf2ac577ac00f3895df7a9064a Mon Sep 17 00:00:00 2001 From: arraykeys Date: Fri, 1 Dec 2017 22:14:07 +0800 Subject: [PATCH] no message --- services/mux_bridge.go | 16 ++++++++++++++-- services/mux_client.go | 31 +++++++++++++++++-------------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/services/mux_bridge.go b/services/mux_bridge.go index c81c469..f6899ae 100644 --- a/services/mux_bridge.go +++ b/services/mux_bridge.go @@ -131,8 +131,20 @@ func (s *MuxBridge) callback(inConn net.Conn, key string) { continue } log.Printf("server stream %s created", ID) - go io.Copy(stream, inConn) - io.Copy(inConn, stream) + die1 := make(chan bool, 1) + die2 := make(chan bool, 1) + go func() { + io.Copy(stream, inConn) + die1 <- true + }() + go func() { + io.Copy(inConn, stream) + die2 <- true + }() + select { + case <-die1: + case <-die2: + } stream.Close() inConn.Close() log.Printf("server stream %s released", ID) diff --git a/services/mux_client.go b/services/mux_client.go index 4a8f324..8b6c400 100644 --- a/services/mux_client.go +++ b/services/mux_client.go @@ -74,20 +74,23 @@ func (s *MuxClient) Start(args interface{}) (err error) { time.Sleep(time.Second * 3) break } - var ID, clientLocalAddr, serverID string - err = utils.ReadPacketData(stream, &ID, &clientLocalAddr, &serverID) - if err != nil { - log.Printf("read connection signal err: %s, retrying...", err) - break - } - log.Printf("signal revecived:%s %s %s", serverID, ID, clientLocalAddr) - protocol := clientLocalAddr[:3] - localAddr := clientLocalAddr[4:] - if protocol == "udp" { - go s.ServeUDP(stream, localAddr, ID) - } else { - go s.ServeConn(stream, localAddr, ID) - } + go func() { + var ID, clientLocalAddr, serverID string + err = utils.ReadPacketData(stream, &ID, &clientLocalAddr, &serverID) + if err != nil { + log.Printf("read stream signal err: %s", err) + stream.Close() + return + } + log.Printf("signal revecived:%s %s %s", serverID, ID, clientLocalAddr) + protocol := clientLocalAddr[:3] + localAddr := clientLocalAddr[4:] + if protocol == "udp" { + s.ServeUDP(stream, localAddr, ID) + } else { + s.ServeConn(stream, localAddr, ID) + } + }() } }