mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-09-27 03:25:56 +08:00
fix: rtsp client read timeout
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const defaultBufSize = 1 << 14
|
const defaultBufSize = 1 << 14
|
||||||
@@ -40,6 +41,34 @@ func NewBufReaderWithBufLen(reader io.Reader, bufLen int) (r *BufReader) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewBufReaderWithTimeout 创建一个具有指定读取超时时间的 BufReader
|
||||||
|
func NewBufReaderWithTimeout(conn net.Conn, timeout time.Duration) (r *BufReader) {
|
||||||
|
r = &BufReader{
|
||||||
|
Allocator: NewScalableMemoryAllocator(defaultBufSize),
|
||||||
|
BufLen: defaultBufSize,
|
||||||
|
feedData: func() error {
|
||||||
|
// 设置读取超时
|
||||||
|
if conn != nil && timeout > 0 {
|
||||||
|
if err := conn.SetReadDeadline(time.Now().Add(timeout)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf, err := r.Allocator.Read(conn, r.BufLen)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
n := len(buf)
|
||||||
|
r.totalRead += n
|
||||||
|
r.buf.Buffers = append(r.buf.Buffers, buf)
|
||||||
|
r.buf.Size += n
|
||||||
|
r.buf.Length += n
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
r.buf.Memory = &Memory{}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func NewBufReaderBuffersChan(feedChan chan net.Buffers) (r *BufReader) {
|
func NewBufReaderBuffersChan(feedChan chan net.Buffers) (r *BufReader) {
|
||||||
r = &BufReader{
|
r = &BufReader{
|
||||||
feedData: func() error {
|
feedData: func() error {
|
@@ -39,12 +39,12 @@ func (r *RecyclableMemory) Recycle() {
|
|||||||
|
|
||||||
func (r *RecyclableMemory) NextN(size int) (memory []byte) {
|
func (r *RecyclableMemory) NextN(size int) (memory []byte) {
|
||||||
memory = make([]byte, size)
|
memory = make([]byte, size)
|
||||||
r.AppendOne(memory)
|
r.PushOne(memory)
|
||||||
return memory
|
return memory
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RecyclableMemory) AddRecycleBytes(b []byte) {
|
func (r *RecyclableMemory) AddRecycleBytes(b []byte) {
|
||||||
r.AppendOne(b)
|
r.PushOne(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
type MemoryAllocator struct {
|
type MemoryAllocator struct {
|
||||||
|
@@ -23,7 +23,7 @@ const Timeout = time.Second * 10
|
|||||||
func NewNetConnection(conn net.Conn) *NetConnection {
|
func NewNetConnection(conn net.Conn) *NetConnection {
|
||||||
return &NetConnection{
|
return &NetConnection{
|
||||||
Conn: conn,
|
Conn: conn,
|
||||||
BufReader: util.NewBufReader(conn),
|
BufReader: util.NewBufReaderWithTimeout(conn, Timeout),
|
||||||
MemoryAllocator: util.NewScalableMemoryAllocator(1 << 12),
|
MemoryAllocator: util.NewScalableMemoryAllocator(1 << 12),
|
||||||
UserAgent: "monibuca" + m7s.Version,
|
UserAgent: "monibuca" + m7s.Version,
|
||||||
}
|
}
|
||||||
@@ -187,9 +187,6 @@ func (c *NetConnection) WriteRequest(req *util.Request) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *NetConnection) ReadRequest() (req *util.Request, err error) {
|
func (c *NetConnection) ReadRequest() (req *util.Request, err error) {
|
||||||
if err = c.Conn.SetReadDeadline(time.Now().Add(Timeout)); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
req, err = util.ReadRequest(c.BufReader)
|
req, err = util.ReadRequest(c.BufReader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@@ -243,9 +240,6 @@ func (c *NetConnection) WriteResponse(res *util.Response) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *NetConnection) ReadResponse() (res *util.Response, err error) {
|
func (c *NetConnection) ReadResponse() (res *util.Response, err error) {
|
||||||
if err := c.Conn.SetReadDeadline(time.Now().Add(Timeout)); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
res, err = util.ReadResponse(c.BufReader)
|
res, err = util.ReadResponse(c.BufReader)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
c.Debug("<-", "res", res.String())
|
c.Debug("<-", "res", res.String())
|
||||||
|
Reference in New Issue
Block a user