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