update
							parent
							
								
									ac53e3fe9a
								
							
						
					
					
						commit
						ebcb0f87a2
					
				
							
								
								
									
										58
									
								
								app/proxy.go
								
								
								
								
							
							
						
						
									
										58
									
								
								app/proxy.go
								
								
								
								
							| 
						 | 
				
			
			@ -9,23 +9,17 @@ import (
 | 
			
		|||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	wg = &sync.WaitGroup{}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Run() {
 | 
			
		||||
	rand.Seed(time.Now().UnixNano())
 | 
			
		||||
 | 
			
		||||
	for name, item := range ProxyMap {
 | 
			
		||||
		wg.Add(1)
 | 
			
		||||
		go listenTcp(name, item)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	wg.Wait()
 | 
			
		||||
	select {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func listenTcp(name string, item ProxyItem) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
 | 
			
		||||
	listen, err := net.Listen("tcp", item.LocalAddr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -36,56 +30,48 @@ func listenTcp(name string, item ProxyItem) {
 | 
			
		|||
	mylog.Infof("[%s] listen %s", name, item.LocalAddr)
 | 
			
		||||
 | 
			
		||||
	for {
 | 
			
		||||
		conn, err := listen.Accept()
 | 
			
		||||
		localConn, err := listen.Accept()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			mylog.Errorf("conn accept err: %s", item.LocalAddr, err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		go proxyTcp(conn, item)
 | 
			
		||||
		go proxyTcp(localConn, item)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func proxyTcp(conn net.Conn, item ProxyItem) {
 | 
			
		||||
 | 
			
		||||
func proxyTcp(localConn net.Conn, item ProxyItem) {
 | 
			
		||||
	randRemoteAddr := item.RemoteAddr[rand.Intn(len(item.RemoteAddr))]
 | 
			
		||||
 | 
			
		||||
	remoteConn, err := net.Dial("tcp", randRemoteAddr)
 | 
			
		||||
	remoteConn, err := net.DialTimeout("tcp", randRemoteAddr, time.Second*3)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		mylog.Errorf("connect remote err: %s\n", err)
 | 
			
		||||
		localConn.Close()
 | 
			
		||||
		mylog.Errorf("connect remote err: %s", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	go copyConn(randRemoteAddr, conn, remoteConn)
 | 
			
		||||
	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()
 | 
			
		||||
 | 
			
		||||
	mylog.Infof("stop proxy %s -> %s", localConn.RemoteAddr(), randRemoteAddr)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func copyConn(addr string, conn, remoteConn net.Conn) {
 | 
			
		||||
	mylog.Infof("start proxy: %s", addr)
 | 
			
		||||
 | 
			
		||||
	wg2 := &sync.WaitGroup{}
 | 
			
		||||
	wg2.Add(2)
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		_, err := io.Copy(conn, remoteConn)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			mylog.Error(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		wg2.Done()
 | 
			
		||||
func copyConn(wg0 *sync.WaitGroup, localConn, remoteConn net.Conn) {
 | 
			
		||||
	defer func() {
 | 
			
		||||
		wg0.Done()
 | 
			
		||||
		localConn.Close()
 | 
			
		||||
		remoteConn.Close()
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		_, err := io.Copy(remoteConn, conn)
 | 
			
		||||
	_, err := io.Copy(remoteConn, localConn)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		mylog.Error(err)
 | 
			
		||||
			return
 | 
			
		||||
	}
 | 
			
		||||
		wg2.Done()
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	wg2.Wait()
 | 
			
		||||
 | 
			
		||||
	mylog.Infof("stop proxy: %s", addr)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue