diff --git a/cmd/cmd b/cmd/cmd new file mode 100755 index 00000000..52548e01 Binary files /dev/null and b/cmd/cmd differ diff --git a/cmd/frps.ini b/cmd/frps.ini new file mode 100644 index 00000000..4da23f99 --- /dev/null +++ b/cmd/frps.ini @@ -0,0 +1,2 @@ +[common] +bind_port = 7000 \ No newline at end of file diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 00000000..3f44f6a3 --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "log" + "time" + + "github.com/fatedier/frp/cmd/frp" +) + +func main() { + frp.RunFrps("./frps.ini") + + ch := make(chan bool) + go func() { + time.Sleep(time.Second * 5) + frp.StopFrps() + ch <- true + }() + <-ch + + // frp.RunFrps("./frps.ini") + log.Println(frp.IsFrpsRunning()) + ch = make(chan bool) + <-ch +} diff --git a/server/service.go b/server/service.go index cfc04507..90c247dd 100644 --- a/server/service.go +++ b/server/service.go @@ -85,6 +85,9 @@ type Service struct { // Closed is service closed Closed bool + + // close chan + closedCh chan bool } func NewService() (svr *Service, err error) { @@ -95,6 +98,7 @@ func NewService() (svr *Service, err error) { visitorManager: NewVisitorManager(), tcpPortManager: ports.NewPortManager("tcp", cfg.ProxyBindAddr, cfg.AllowPorts), udpPortManager: ports.NewPortManager("udp", cfg.ProxyBindAddr, cfg.AllowPorts), + closedCh: make(chan bool), } svr.tcpGroupCtl = group.NewTcpGroupCtl(svr.tcpPortManager) @@ -235,26 +239,28 @@ func (svr *Service) Run() { svr.HandleListener(svr.listener) } +// Stop 停止服务 func (svr *Service) Stop() error { err := svr.muxer.Close() - if err != nil { - return err - } - return svr.listener.Close() + <-svr.closedCh + svr.Closed = true + return err } func (svr *Service) HandleListener(l frpNet.Listener) { defer func() { - svr.Closed = true - log.Warn("Frps is Closed") + close(svr.closedCh) + log.Info("Frps is Closed") }() // Listen for incoming connections from client. for { + log.Info("Wait for new Connect") c, err := l.Accept() if err != nil { log.Warn("Listener for incoming connections from client closed") return } + log.Info("New Conn: ", c, err) // Start a new goroutine for dealing connections. go func(frpConn frpNet.Conn) { diff --git a/utils/net/listener.go b/utils/net/listener.go index 90ea59b4..e9f59b32 100644 --- a/utils/net/listener.go +++ b/utils/net/listener.go @@ -45,10 +45,17 @@ func WrapLogListener(l net.Listener) Listener { } func (logL *LogListener) Accept() (Conn, error) { + log.Info("call Accept") c, err := logL.l.Accept() + log.Info("Accept new conn: ", c) return WrapConn(c), err } +// Close 关闭listener +func (logL *LogListener) Close() error { + return logL.l.Close() +} + // Custom listener type CustomListener struct { conns chan Conn diff --git a/vendor/github.com/fatedier/golib/net/mux/mux.go b/vendor/github.com/fatedier/golib/net/mux/mux.go index ffbfbd3c..87315f8e 100644 --- a/vendor/github.com/fatedier/golib/net/mux/mux.go +++ b/vendor/github.com/fatedier/golib/net/mux/mux.go @@ -144,6 +144,7 @@ func (mux *Mux) Serve() error { } if err != nil { + close(mux.defaultLn.c) return err }