client: enable keepalives in most cases (#775)

This commit is contained in:
Alessandro Ros
2025-05-04 15:39:07 +02:00
committed by GitHub
parent 2cbdc2a0b7
commit 904b0a1920
5 changed files with 50 additions and 19 deletions

View File

@@ -889,7 +889,8 @@ func (c *Client) startTransportRoutines() {
c.tcpBuffer = make([]byte, c.MaxPacketSize+4) c.tcpBuffer = make([]byte, c.MaxPacketSize+4)
} }
if c.state == clientStatePlay { // always enable keepalives unless we are recording with TCP
if c.state == clientStatePlay || *c.effectiveTransport != TransportTCP {
c.keepAliveTimer = time.NewTimer(c.keepAlivePeriod) c.keepAliveTimer = time.NewTimer(c.keepAlivePeriod)
} }

View File

@@ -432,7 +432,8 @@ func TestClientPlay(t *testing.T) {
require.NoError(t, err2) require.NoError(t, err2)
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
// server -> client (RTP) // server -> client RTP packet
switch transport { switch transport {
case "udp": case "udp":
_, err2 = l1s[i].WriteTo(testRTPPacketMarshaled, &net.UDPAddr{ _, err2 = l1s[i].WriteTo(testRTPPacketMarshaled, &net.UDPAddr{
@@ -456,7 +457,8 @@ func TestClientPlay(t *testing.T) {
require.NoError(t, err2) require.NoError(t, err2)
} }
// client -> server (RTCP) // client -> server RTCP packet
switch transport { switch transport {
case "udp", "multicast": case "udp", "multicast":
// skip firewall opening // skip firewall opening
@@ -2874,7 +2876,6 @@ func TestClientPlayDifferentSource(t *testing.T) {
}) })
require.NoError(t, err2) require.NoError(t, err2)
// server -> client (RTP)
_, err2 = l1.WriteTo(testRTPPacketMarshaled, &net.UDPAddr{ _, err2 = l1.WriteTo(testRTPPacketMarshaled, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"), IP: net.ParseIP("127.0.0.1"),
Port: th.ClientPorts[0], Port: th.ClientPorts[0],

View File

@@ -235,6 +235,10 @@ func TestClientRecord(t *testing.T) {
StatusCode: base.StatusOK, StatusCode: base.StatusOK,
Header: base.Header{ Header: base.Header{
"Transport": th.Marshal(), "Transport": th.Marshal(),
"Session": headers.Session{
Session: "ABCDE",
Timeout: uintPtr(1),
}.Marshal(),
}, },
}) })
require.NoError(t, err2) require.NoError(t, err2)
@@ -249,30 +253,49 @@ func TestClientRecord(t *testing.T) {
}) })
require.NoError(t, err2) require.NoError(t, err2)
// client -> server (RTP) var pl []byte
// client -> server RTP packet
if transport == "udp" { if transport == "udp" {
buf := make([]byte, 2048) buf := make([]byte, 2048)
var n int var n int
n, _, err2 = l1.ReadFrom(buf) n, _, err2 = l1.ReadFrom(buf)
require.NoError(t, err2) require.NoError(t, err2)
pl = buf[:n]
var pkt rtp.Packet
err2 = pkt.Unmarshal(buf[:n])
require.NoError(t, err2)
require.Equal(t, testRTPPacket, pkt)
} else { } else {
var f *base.InterleavedFrame var f *base.InterleavedFrame
f, err2 = conn.ReadInterleavedFrame() f, err2 = conn.ReadInterleavedFrame()
require.NoError(t, err2) require.NoError(t, err2)
require.Equal(t, 0, f.Channel) require.Equal(t, 0, f.Channel)
pl = f.Payload
var pkt rtp.Packet
err2 = pkt.Unmarshal(f.Payload)
require.NoError(t, err2)
require.Equal(t, testRTPPacket, pkt)
} }
// server -> client (RTCP) var pkt rtp.Packet
err2 = pkt.Unmarshal(pl)
require.NoError(t, err2)
require.Equal(t, testRTPPacket, pkt)
// client -> server keepalive (UDP only)
if transport == "udp" {
recv := make(chan struct{})
go func() {
defer close(recv)
req, err2 = conn.ReadRequest()
require.NoError(t, err2)
require.Equal(t, base.Options, req.Method)
}()
select {
case <-recv:
case <-time.After(2 * time.Second):
t.Errorf("should not happen")
}
}
// server -> client RTCP packet
if transport == "udp" { if transport == "udp" {
_, err2 = l2.WriteTo(testRTCPPacketMarshaled, &net.UDPAddr{ _, err2 = l2.WriteTo(testRTCPPacketMarshaled, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"), IP: net.ParseIP("127.0.0.1"),

View File

@@ -848,6 +848,7 @@ func TestServerPlay(t *testing.T) {
doPlay(t, conn, "rtsp://"+listenIP+":8554/teststream", session) doPlay(t, conn, "rtsp://"+listenIP+":8554/teststream", session)
// server -> client (direct) // server -> client (direct)
switch transport { switch transport {
case "udp": case "udp":
buf := make([]byte, 2048) buf := make([]byte, 2048)
@@ -874,6 +875,7 @@ func TestServerPlay(t *testing.T) {
} }
// server -> client (through stream) // server -> client (through stream)
if transport == "udp" || transport == "multicast" { if transport == "udp" || transport == "multicast" {
buf := make([]byte, 2048) buf := make([]byte, 2048)
var n int var n int
@@ -904,7 +906,8 @@ func TestServerPlay(t *testing.T) {
} }
} }
// client -> server (RTCP) // client -> server RTCP packet
switch transport { switch transport {
case "udp": case "udp":
_, err = l2.WriteTo(testRTCPPacketMarshaled, &net.UDPAddr{ _, err = l2.WriteTo(testRTCPPacketMarshaled, &net.UDPAddr{

View File

@@ -728,6 +728,7 @@ func TestServerRecord(t *testing.T) {
} }
// server -> client (direct) // server -> client (direct)
if transport == "udp" { if transport == "udp" {
buf := make([]byte, 2048) buf := make([]byte, 2048)
var n int var n int
@@ -742,7 +743,8 @@ func TestServerRecord(t *testing.T) {
require.Equal(t, testRTCPPacketMarshaled, f.Payload) require.Equal(t, testRTCPPacketMarshaled, f.Payload)
} }
// client -> server // client -> server RTP+RTCP packets
if transport == "udp" { if transport == "udp" {
_, err = l1s[i].WriteTo(testRTPPacketMarshaled, &net.UDPAddr{ _, err = l1s[i].WriteTo(testRTPPacketMarshaled, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"), IP: net.ParseIP("127.0.0.1"),
@@ -771,7 +773,8 @@ func TestServerRecord(t *testing.T) {
} }
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
// server -> client (RTCP) // server -> client RTCP packet
if transport == "udp" { if transport == "udp" {
buf := make([]byte, 2048) buf := make([]byte, 2048)
n, _, err := l2s[i].ReadFrom(buf) n, _, err := l2s[i].ReadFrom(buf)