fix: rtsp client read timeout

This commit is contained in:
langhuihui
2025-09-10 09:44:23 +08:00
parent 3059a61dc5
commit 46ababe7a9
4 changed files with 32 additions and 9 deletions

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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())