Allow to close a server
This commit is contained in:
parent
5c79045481
commit
68d2f4ed42
@ -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 (
|
||||||
|
Loading…
x
Reference in New Issue
Block a user