update
							parent
							
								
									ebcb0f87a2
								
							
						
					
					
						commit
						69e7c19ea8
					
				
							
								
								
									
										45
									
								
								app/proxy.go
								
								
								
								
							
							
						
						
									
										45
									
								
								app/proxy.go
								
								
								
								
							| 
						 | 
				
			
			@ -1,14 +1,23 @@
 | 
			
		|||
package app
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"git.makemake.in/test/mycommon/mylog"
 | 
			
		||||
	"io"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
	"os/signal"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	mainWg              = &sync.WaitGroup{}
 | 
			
		||||
	mainCtx, mainCancel = context.WithCancel(context.Background())
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Run() {
 | 
			
		||||
	rand.Seed(time.Now().UnixNano())
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -16,7 +25,16 @@ func Run() {
 | 
			
		|||
		go listenTcp(name, item)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	select {}
 | 
			
		||||
	ch := make(chan os.Signal, 1)
 | 
			
		||||
	signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
 | 
			
		||||
 | 
			
		||||
	v := <-ch
 | 
			
		||||
	mylog.Infof("捕获退出信号: %s", v.String())
 | 
			
		||||
	mainCancel()
 | 
			
		||||
 | 
			
		||||
	mainWg.Wait()
 | 
			
		||||
	mylog.Info("stop")
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func listenTcp(name string, item ProxyItem) {
 | 
			
		||||
| 
						 | 
				
			
			@ -36,11 +54,14 @@ func listenTcp(name string, item ProxyItem) {
 | 
			
		|||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		mainWg.Add(1)
 | 
			
		||||
		go proxyTcp(localConn, item)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func proxyTcp(localConn net.Conn, item ProxyItem) {
 | 
			
		||||
	defer mainWg.Done()
 | 
			
		||||
 | 
			
		||||
	randRemoteAddr := item.RemoteAddr[rand.Intn(len(item.RemoteAddr))]
 | 
			
		||||
 | 
			
		||||
	remoteConn, err := net.DialTimeout("tcp", randRemoteAddr, time.Second*3)
 | 
			
		||||
| 
						 | 
				
			
			@ -52,11 +73,23 @@ func proxyTcp(localConn net.Conn, item ProxyItem) {
 | 
			
		|||
 | 
			
		||||
	mylog.Infof("start proxy %s -> %s", localConn.RemoteAddr(), randRemoteAddr)
 | 
			
		||||
 | 
			
		||||
	wg0 := &sync.WaitGroup{}
 | 
			
		||||
	wg0.Add(2)
 | 
			
		||||
	go copyConn(wg0, localConn, remoteConn)
 | 
			
		||||
	go copyConn(wg0, remoteConn, localConn)
 | 
			
		||||
	wg0.Wait()
 | 
			
		||||
	waitCh := make(chan struct{})
 | 
			
		||||
	go func() {
 | 
			
		||||
		wg0 := &sync.WaitGroup{}
 | 
			
		||||
		wg0.Add(2)
 | 
			
		||||
		go copyConn(wg0, localConn, remoteConn)
 | 
			
		||||
		go copyConn(wg0, remoteConn, localConn)
 | 
			
		||||
		wg0.Wait()
 | 
			
		||||
		close(waitCh)
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	select {
 | 
			
		||||
	case <-waitCh:
 | 
			
		||||
 | 
			
		||||
	case <-mainCtx.Done():
 | 
			
		||||
		localConn.Close()
 | 
			
		||||
		remoteConn.Close()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mylog.Infof("stop proxy %s -> %s", localConn.RemoteAddr(), randRemoteAddr)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue