new server structure

This commit is contained in:
aler9
2020-12-08 19:29:25 +01:00
parent 2f6c928c92
commit 927511d81e
5 changed files with 207 additions and 60 deletions

View File

@@ -3,33 +3,27 @@ package gortsplib
import (
"bufio"
"net"
"sync"
"time"
"github.com/aler9/gortsplib/pkg/base"
"github.com/aler9/gortsplib/pkg/multibuffer"
)
// ServerHandler is the interface that must be implemented to use a Server.
type ServerHandler interface {
}
// Server is a RTSP server.
type Server struct {
conf ServerConf
listener *net.TCPListener
handler func(sc *ServerConn) ServerConnHandler
wg sync.WaitGroup
}
// Close closes the server.
func (s *Server) Close() error {
return s.listener.Close()
s.listener.Close()
s.wg.Wait()
return nil
}
// Accept accepts a connection.
func (s *Server) Accept() (*ServerConn, error) {
nconn, err := s.listener.Accept()
if err != nil {
return nil, err
}
func (s *Server) run() {
defer s.wg.Done()
if s.conf.ReadTimeout == 0 {
s.conf.ReadTimeout = 10 * time.Second
@@ -41,15 +35,26 @@ func (s *Server) Accept() (*ServerConn, error) {
s.conf.ReadBufferCount = 1
}
sc := &ServerConn{
conf: s.conf,
nconn: nconn,
br: bufio.NewReaderSize(nconn, serverReadBufferSize),
bw: bufio.NewWriterSize(nconn, serverWriteBufferSize),
request: &base.Request{},
frame: &base.InterleavedFrame{},
tcpFrameBuffer: multibuffer.New(s.conf.ReadBufferCount, clientTCPFrameReadBufferSize),
}
for {
nconn, err := s.listener.Accept()
if err != nil {
break
}
return sc, nil
sc := &ServerConn{
s: s,
nconn: nconn,
br: bufio.NewReaderSize(nconn, serverReadBufferSize),
bw: bufio.NewWriterSize(nconn, serverWriteBufferSize),
}
sc.connHandler = s.handler(sc)
if sc.connHandler == nil {
nconn.Close()
continue
}
s.wg.Add(1)
go sc.run()
}
}