client: send receiver reports to server even with AnyPortEnable (https://github.com/aler9/rtsp-simple-server/issues/698)

This commit is contained in:
aler9
2021-11-30 22:23:24 +01:00
parent de3cf01242
commit 870687d91d
3 changed files with 33 additions and 8 deletions

View File

@@ -1418,7 +1418,7 @@ func (c *Client) doSetup(
rtpListener.remoteReadIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP rtpListener.remoteReadIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP
rtpListener.remoteWriteIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP rtpListener.remoteWriteIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP
rtpListener.remoteZone = c.nconn.RemoteAddr().(*net.TCPAddr).Zone rtpListener.remoteZone = c.nconn.RemoteAddr().(*net.TCPAddr).Zone
if !c.AnyPortEnable { if thRes.ServerPorts != nil {
rtpListener.remotePort = thRes.ServerPorts[0] rtpListener.remotePort = thRes.ServerPorts[0]
} }
rtpListener.trackID = trackID rtpListener.trackID = trackID
@@ -1428,7 +1428,7 @@ func (c *Client) doSetup(
rtcpListener.remoteReadIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP rtcpListener.remoteReadIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP
rtcpListener.remoteWriteIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP rtcpListener.remoteWriteIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP
rtcpListener.remoteZone = c.nconn.RemoteAddr().(*net.TCPAddr).Zone rtcpListener.remoteZone = c.nconn.RemoteAddr().(*net.TCPAddr).Zone
if !c.AnyPortEnable { if thRes.ServerPorts != nil {
rtcpListener.remotePort = thRes.ServerPorts[1] rtcpListener.remotePort = thRes.ServerPorts[1]
} }
rtcpListener.trackID = trackID rtcpListener.trackID = trackID

View File

@@ -799,6 +799,8 @@ func TestClientReadAnyPort(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
defer l.Close() defer l.Close()
serverRecv := make(chan struct{})
serverDone := make(chan struct{}) serverDone := make(chan struct{})
defer func() { <-serverDone }() defer func() { <-serverDone }()
go func() { go func() {
@@ -852,6 +854,14 @@ func TestClientReadAnyPort(t *testing.T) {
err = th.Read(req.Header["Transport"]) err = th.Read(req.Header["Transport"])
require.NoError(t, err) require.NoError(t, err)
l1a, err := net.ListenPacket("udp", "localhost:13344")
require.NoError(t, err)
defer l1a.Close()
l1b, err := net.ListenPacket("udp", "localhost:23041")
require.NoError(t, err)
defer l1b.Close()
err = base.Response{ err = base.Response{
StatusCode: base.StatusOK, StatusCode: base.StatusOK,
Header: base.Header{ Header: base.Header{
@@ -893,14 +903,23 @@ func TestClientReadAnyPort(t *testing.T) {
time.Sleep(500 * time.Millisecond) time.Sleep(500 * time.Millisecond)
l1, err := net.ListenPacket("udp", "localhost:13344") l1a.WriteTo([]byte{0x01, 0x02, 0x03, 0x04}, &net.UDPAddr{
require.NoError(t, err)
defer l1.Close()
l1.WriteTo([]byte("\x00\x00\x00\x00"), &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"), IP: net.ParseIP("127.0.0.1"),
Port: th.ClientPorts[0], Port: th.ClientPorts[0],
}) })
if ca == "random" {
// skip firewall opening
buf := make([]byte, 2048)
_, _, err := l1b.ReadFrom(buf)
require.NoError(t, err)
buf = make([]byte, 2048)
n, _, err := l1b.ReadFrom(buf)
require.NoError(t, err)
require.Equal(t, buf[:n], []byte{0x05, 0x06, 0x07, 0x08})
close(serverRecv)
}
}() }()
frameRecv := make(chan struct{}) frameRecv := make(chan struct{})
@@ -908,6 +927,7 @@ func TestClientReadAnyPort(t *testing.T) {
c := &Client{ c := &Client{
AnyPortEnable: true, AnyPortEnable: true,
OnPacketRTP: func(trackID int, payload []byte) { OnPacketRTP: func(trackID int, payload []byte) {
require.Equal(t, payload, []byte{0x01, 0x02, 0x03, 0x04})
close(frameRecv) close(frameRecv)
}, },
} }
@@ -917,6 +937,11 @@ func TestClientReadAnyPort(t *testing.T) {
defer c.Close() defer c.Close()
<-frameRecv <-frameRecv
if ca == "random" {
c.WritePacketRTCP(0, []byte{0x05, 0x06, 0x07, 0x08})
<-serverRecv
}
}) })
} }
} }

View File

@@ -165,7 +165,7 @@ func (l *clientUDPListener) run() {
uaddr := addr.(*net.UDPAddr) uaddr := addr.(*net.UDPAddr)
if !l.remoteReadIP.Equal(uaddr.IP) || (l.remotePort != 0 && l.remotePort != uaddr.Port) { if !l.remoteReadIP.Equal(uaddr.IP) || (!l.c.AnyPortEnable && l.remotePort != uaddr.Port) {
continue continue
} }