Allow to close a server

This commit is contained in:
Ingo Oppermann 2021-01-12 17:30:00 +01:00
parent 5c79045481
commit 68d2f4ed42

View File

@ -7,6 +7,7 @@ import (
"crypto/rand" "crypto/rand"
"crypto/sha256" "crypto/sha256"
"encoding/hex" "encoding/hex"
"errors"
"fmt" "fmt"
"github.com/datarhei/joy4/utils/bits/pio" "github.com/datarhei/joy4/utils/bits/pio"
"github.com/datarhei/joy4/av" "github.com/datarhei/joy4/av"
@ -53,11 +54,16 @@ func DialTimeout(uri string, timeout time.Duration) (conn *Conn, err error) {
return return
} }
var ErrServerClosed = errors.New("rtmp: Server closed")
type Server struct { type Server struct {
Addr string Addr string
HandlePublish func(*Conn) HandlePublish func(*Conn)
HandlePlay func(*Conn) HandlePlay func(*Conn)
HandleConn func(*Conn) HandleConn func(*Conn)
listener *net.TCPListener
doneChan chan struct{}
} }
func (self *Server) handleConn(conn *Conn) (err error) { func (self *Server) handleConn(conn *Conn) (err error) {
@ -82,30 +88,41 @@ func (self *Server) handleConn(conn *Conn) (err error) {
return return
} }
func (self *Server) ListenAndServe() (err error) { func (self *Server) ListenAndServe() error {
addr := self.Addr addr := self.Addr
if addr == "" { if addr == "" {
addr = ":1935" addr = ":1935"
} }
var tcpaddr *net.TCPAddr
if tcpaddr, err = net.ResolveTCPAddr("tcp", addr); err != nil { tcpaddr, err := net.ResolveTCPAddr("tcp", addr)
err = fmt.Errorf("rtmp: ListenAndServe: %s", err) if err != nil {
return return fmt.Errorf("rtmp: %w", err)
} }
var listener *net.TCPListener listener, err := net.ListenTCP("tcp", tcpaddr)
if listener, err = net.ListenTCP("tcp", tcpaddr); err != nil { if err != nil {
return return fmt.Errorf("rtmp: %w", err)
} }
self.doneChan = make(chan struct{})
self.listener = listener
defer func() { self.listener = nil }()
if Debug { if Debug {
fmt.Println("rtmp: server: listening on", addr) fmt.Println("rtmp: server: listening on", addr)
} }
for { for {
var netconn net.Conn netconn, err := self.listener.Accept()
if netconn, err = listener.Accept(); err != nil { if err != nil {
return select {
case <-self.doneChan:
return ErrServerClosed
default:
}
return err
} }
if Debug { if Debug {
@ -121,6 +138,18 @@ func (self *Server) ListenAndServe() (err error) {
} }
}() }()
} }
return nil
}
func (self *Server) Close() {
if self.listener == nil {
return
}
close(self.doneChan)
self.listener.Close()
} }
const ( const (