added listener close()

This commit is contained in:
2023-05-18 12:53:37 +02:00
parent f814bb7d24
commit cb6d26a7cc
+13 -4
View File
@@ -29,6 +29,8 @@ type Service struct {
keepalive bool keepalive bool
kaTime time.Duration kaTime time.Duration
kaMtx sync.Mutex kaMtx sync.Mutex
listener net.Listener
tcpListener *net.TCPListener
} }
func NewService() *Service { func NewService() *Service {
@@ -78,14 +80,14 @@ func (svc *Service) Listen(address string) error {
err = fmt.Errorf("unable to resolve adddress: %s", err) err = fmt.Errorf("unable to resolve adddress: %s", err)
return err return err
} }
listener, err := net.ListenTCP("tcp", addr) svc.tcpListener, err = net.ListenTCP("tcp", addr)
if err != nil { if err != nil {
err = fmt.Errorf("unable to start listener: %s", err) err = fmt.Errorf("unable to start listener: %s", err)
return err return err
} }
for { for {
conn, err := listener.AcceptTCP() conn, err := svc.tcpListener.AcceptTCP()
if err != nil { if err != nil {
logError("conn accept err:", err) logError("conn accept err:", err)
} }
@@ -104,19 +106,20 @@ func (svc *Service) ListenTLS(address string, tlsConfig *tls.Config) error {
var err error var err error
logInfo("server listen:", address) logInfo("server listen:", address)
listener, err := tls.Listen("tcp", address, tlsConfig) svc.listener, err = tls.Listen("tcp", address, tlsConfig)
if err != nil { if err != nil {
err = fmt.Errorf("unable to start listener: %s", err) err = fmt.Errorf("unable to start listener: %s", err)
return err return err
} }
for { for {
conn, err := listener.Accept() conn, err := svc.listener.Accept()
if err != nil { if err != nil {
logError("conn accept err:", err) logError("conn accept err:", err)
} }
select { select {
case <-svc.ctx.Done(): case <-svc.ctx.Done():
logMessage("accept loop done")
return err return err
default: default:
} }
@@ -136,6 +139,12 @@ func (svc *Service) Stop() error {
var err error var err error
// Disable new connection // Disable new connection
logInfo("cancel rpc accept loop") logInfo("cancel rpc accept loop")
if svc.listener != nil {
svc.listener.Close()
}
if svc.tcpListener != nil {
svc.tcpListener.Close()
}
svc.cancel() svc.cancel()
// Wait handlers // Wait handlers
logInfo("wait rpc handlers") logInfo("wait rpc handlers")