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/textproto"
"strings"
"time"
)
const defaultBufSize = 1 << 14
@@ -40,6 +41,34 @@ func NewBufReaderWithBufLen(reader io.Reader, bufLen int) (r *BufReader) {
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) {
r = &BufReader{
feedData: func() error {

View File

@@ -39,12 +39,12 @@ func (r *RecyclableMemory) Recycle() {
func (r *RecyclableMemory) NextN(size int) (memory []byte) {
memory = make([]byte, size)
r.AppendOne(memory)
r.PushOne(memory)
return memory
}
func (r *RecyclableMemory) AddRecycleBytes(b []byte) {
r.AppendOne(b)
r.PushOne(b)
}
type MemoryAllocator struct {

View File

@@ -23,7 +23,7 @@ const Timeout = time.Second * 10
func NewNetConnection(conn net.Conn) *NetConnection {
return &NetConnection{
Conn: conn,
BufReader: util.NewBufReader(conn),
BufReader: util.NewBufReaderWithTimeout(conn, Timeout),
MemoryAllocator: util.NewScalableMemoryAllocator(1 << 12),
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) {
if err = c.Conn.SetReadDeadline(time.Now().Add(Timeout)); err != nil {
return
}
req, err = util.ReadRequest(c.BufReader)
if err != nil {
return
@@ -243,9 +240,6 @@ func (c *NetConnection) WriteResponse(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)
if err == nil {
c.Debug("<-", "res", res.String())