@@ -92,7 +92,6 @@ func (s *Tunnel) cliProcess(c *utils.Conn) error {
9292 s .verifyError (c )
9393 return errors .New ("验证错误" )
9494 }
95- log .Println ("客户端连接成功: " , c .Conn .RemoteAddr ())
9695 c .Conn .(* net.TCPConn ).SetReadDeadline (time.Time {})
9796 //做一个判断 添加到对应的channel里面以供使用
9897 if flag , err := c .ReadFlag (); err != nil {
@@ -106,6 +105,7 @@ func (s *Tunnel) cliProcess(c *utils.Conn) error {
106105func (s * Tunnel ) typeDeal (typeVal string , c * utils.Conn , cFlag string ) error {
107106 switch typeVal {
108107 case utils .WORK_MAIN :
108+ log .Println ("客户端连接成功" , c .Conn .RemoteAddr ())
109109 s .addList (s .SignalList , c , cFlag )
110110 case utils .WORK_CHAN :
111111 s .addList (s .TunnelList , c , cFlag )
@@ -131,14 +131,13 @@ func (s *Tunnel) addList(m map[string]*list, c *utils.Conn, cFlag string) {
131131
132132//新建隧道
133133func (s * Tunnel ) newChan (cFlag string ) error {
134- if err := s .wait (s .SignalList , cFlag ); err != nil {
134+ var connPass * utils.Conn
135+ var err error
136+ retry:
137+ if connPass , err = s .waitAndPop (s .SignalList , cFlag ); err != nil {
135138 return err
136139 }
137- retry:
138- connPass := s .SignalList [cFlag ].Pop ()
139- _ , err := connPass .Conn .Write ([]byte ("chan" ))
140- if err != nil {
141- log .Println (err )
140+ if _ , err = connPass .Conn .Write ([]byte ("chan" )); err != nil {
142141 goto retry
143142 }
144143 s .SignalList [cFlag ].Add (connPass )
@@ -152,10 +151,9 @@ func (s *Tunnel) GetTunnel(cFlag string, en, de int, crypt, mux bool) (c *utils.
152151 go s .newChan (cFlag )
153152 }
154153retry:
155- if err = s .wait (s .TunnelList , cFlag ); err != nil {
154+ if c , err = s .waitAndPop (s .TunnelList , cFlag ); err != nil {
156155 return
157156 }
158- c = s .TunnelList [cFlag ].Pop ()
159157 if _ , err = c .WriteTest (); err != nil {
160158 c .Close ()
161159 goto retry
@@ -212,22 +210,26 @@ func (s *Tunnel) delClient(cFlag string, l map[string]*list) {
212210}
213211
214212//等待
215- func (s * Tunnel ) wait (m map [string ]* list , cFlag string ) error {
213+ func (s * Tunnel ) waitAndPop (m map [string ]* list , cFlag string ) ( c * utils. Conn , err error ) {
216214 ticker := time .NewTicker (time .Millisecond * 100 )
217215 stop := time .After (time .Second * 10 )
218- loop:
219216 for {
220217 select {
221218 case <- ticker .C :
222- if _ , ok := m [cFlag ]; ok {
219+ s .lock .Lock ()
220+ if v , ok := m [cFlag ]; ok && v .Len () > 0 {
221+ c = v .Pop ()
223222 ticker .Stop ()
224- break loop
223+ s .lock .Unlock ()
224+ return
225225 }
226+ s .lock .Unlock ()
226227 case <- stop :
227- return errors .New ("client key: " + cFlag + ",err: get client conn timeout" )
228+ err = errors .New ("client key: " + cFlag + ",err: get client conn timeout" )
229+ return
228230 }
229231 }
230- return nil
232+ return
231233}
232234
233235func (s * Tunnel ) verify (vKeyMd5 string ) bool {
0 commit comments