Hi, I've digged a bit further into this. The problem is related to the backgroundhandler being overwritten before a TCP connection to the 'back end' is established, i.e. before RTSPClient::connectionHandler has been called.
The problem frequently occurs in the following scenarios: 1) ProxyRTSPClient::continueAfterLivenessCommand called from within the stack frame of SocketDescriptor::tcpReadHandler. During reset of the ProxyRTSPClient, socketDescriptor->fDeleteMyselfNext is set. Then, the socketDescriptor is deleted from SocketDescriptor::tcpReadHandler, this will have the side effect of also doing fEnv.taskScheduler().turnOffBackgroundReadHandling on the new socket. (I guess this is actually done on the "wrong" socket and related to the socket number being reused?) Hence, RTSPClient::connectionHandler will never be called. I tried to solve this by deferring the reset of the ProxyRTSPClient as a scheduled task, and it seems to work well. (The log in the previous message shows the sequence) 2) A client to the proxy server issues PLAY while the connection to the 'back end' is being reestablished. This will cause RTPInterface::startNetworkReading to change the background handler from RTSPClient::connectionHandler to SocketDescriptor::tcpReadHandler, again preventing RTSPClient::connectionHandler from being called. How to solve this? Should the ProxyRTSPClient for example be reset as soon as the TCP connection is lost (when streaming over TCP), thus preventing a client from issuing a PLAY while connection to 'back-end' is being reestablished? (Log is available if it's of any use) /Erik 2016-12-26 17:03 GMT+01:00 Erik Montnemery <e...@montnemery.com>: > Hi, > > Most of the time, the proxy server reconnects to the 'back-end' server > after an error or loss of connection, but every now and then the > following happens: > > Error or connection loss is detected, and the reset sequence is performed. > However, after the new connection to the 'back end' server is > initiated but before it is established, the socket's background > handler is reset and the reestablish of the connection to the 'back > end' server is thus hung forever: > > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 5)::deregisterRTPInterface(channel 0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 5)::deregisterRTPInterface(channel 255) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor::deregisterRTPInterface setting fDeleteMyselfNext > ^-- fDeleteMyselfNext is set > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading > turnOffBackgroundReadHandling(4294967295) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(4294967295, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading > turnOffBackgroundReadHandling(4294967295) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(4294967295, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 5)::deregisterRTPInterface(channel 2) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[(NULL)]: Calling setBaseURL(fOurURL) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[rtsp://root:xxxxxx@192.168.0.35/axis-media/media.amp]: > Calling sendDESCRIBE(this) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient::sendDESCRIBE rtspClient == NULL: FALSE > Dec 26 16:20:15 Thor live555ProxyServer[27609]: RTSPClient::sendRequest > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::sendRequest - we need to open a connection > Dec 26 16:20:15 Thor live555ProxyServer[27609]: RTSPClient::openConnection > Dec 26 16:20:15 Thor live555ProxyServer[27609]: Opening connection to > 192.168.0.35, port 554... > Dec 26 16:20:15 Thor live555ProxyServer[27609]: Setting up > BackgroundHandling for socket 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::connectToServer setBackgroundHandling(5, > SOCKET_WRITABLE|SOCKET_EXCEPTION, connectionHandler, this) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(5, c, 0x40a250, 0x10b6430) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::sendRequest - connectResult:0 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::sendRequest - connectionIsPending:1 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[rtsp://root:xxxxxx@192.168.0.35/axis-media/media.amp]: > Reset done > ^-- Reset sequence in ProxyRTSPClient::continueAfterLivenessCommand finished > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor::tcpReadHandler fDeleteMyselfNext set > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor::~SocketDescriptor turnOffBackgroundReadHandling(5) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(5, 0, 0x0, 0x0) > ^-- Background handler reset again before the connection is reestablished > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::handleAlternativeRequestByte1 setBackgroundHandling(5, > SOCKET_READABLE|SOCKET_EXCEPTION, incomingDataHandler, this) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(5, a, 0x40d4f0, 0x10b6430) > > I guess the problem is related to the reset sequence being run from > within SocketDescriptor::tcpReadHandler? > > More context: > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[rtsp://192.168.0.35/axis-media/media.amp/]: lost > connection to server ('errno': -2). Resetting... > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[rtsp://192.168.0.35/axis-media/media.amp/]: Calling > reset > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[rtsp://192.168.0.35/axis-media/media.amp/]: > ProxyRTSPClient::reset enter > Dec 26 16:20:15 Thor live555ProxyServer[27609]: RTSPClient::reset > Dec 26 16:20:15 Thor live555ProxyServer[27609]: RTSPClient::resetTCPSockets > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::resetTCPSockets disableBackgroundHandling(5) 1 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(5, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[(NULL)]: ProxyRTSPClient::reset leave > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[(NULL)]: Calling > fOurServerMediaSession.resetDESCRIBEState() > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPServer::RTSPClientSession(0x17eea90)::~RTSPClientSession > session(0x10b6210)->referenceCount(): 1 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 1 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 2 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 9 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 9)::deregisterRTPInterface(channel 0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 9 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 9)::deregisterRTPInterface(channel 1) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 3 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() > streamState(0x17eea20)->referenceCount(): 1 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 4 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > StreamState(0x17eea20)::~StreamState() > Dec 26 16:20:15 Thor live555ProxyServer[27609]: StreamState::reclaim() > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading turnOffBackgroundReadHandling(28) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(28, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading > turnOffBackgroundReadHandling(4294967295) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(4294967295, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 5)::deregisterRTPInterface(channel 0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading > turnOffBackgroundReadHandling(4294967295) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(4294967295, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 5)::deregisterRTPInterface(channel 0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyServerMediaSubsession[(NULL),H264]::closeStreamSource() > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyServerMediaSubsession[(NULL),H264]::closeStreamSource() > fParentSession(0x10b6210)->refcnt: 1 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyServerMediaSubsession[(NULL),H264]::closeStreamSource() > subsession: (0) port:52784, codecName: H264, hasRTPSource: YES > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyServerMediaSubsession[(NULL),H264]::closeStreamSource() > subsession: (1) port:43362, codecName: MPEG4-GENERIC, hasRTPSource: > YES > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 6 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 1 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 2 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 9 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 9)::deregisterRTPInterface(channel 2) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 9 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 9)::deregisterRTPInterface(channel 3) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor::deregisterRTPInterface calling delete > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor::~SocketDescriptor turnOffBackgroundReadHandling(9) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(9, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(9, a, 0x402d1a, 0x189b340) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 3 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() > streamState(0x1894570)->referenceCount(): 1 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 4 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > StreamState(0x1894570)::~StreamState() > Dec 26 16:20:15 Thor live555ProxyServer[27609]: StreamState::reclaim() > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading turnOffBackgroundReadHandling(31) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(31, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading > turnOffBackgroundReadHandling(4294967295) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(4294967295, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 5)::deregisterRTPInterface(channel 2) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyServerMediaSubsession[(NULL),MPEG4-GENERIC]::closeStreamSource() > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyServerMediaSubsession[(NULL),MPEG4-GENERIC]::closeStreamSource() > fParentSession(0x10b6210)->refcnt: 1 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyServerMediaSubsession[(NULL),MPEG4-GENERIC]::closeStreamSource() > subsession: (0) port:52784, codecName: H264, hasRTPSource: YES > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyServerMediaSubsession[(NULL),MPEG4-GENERIC]::closeStreamSource() > subsession: (1) port:43362, codecName: MPEG4-GENERIC, hasRTPSource: > YES > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > OnDemandServerMediaSubsession::deleteStream() 6 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > GenericMediaServer::ClientSession::~ClientSession > fOurServerMediaSession(0x10b6210)->referenceCount(): 0 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyServerMediaSubsession[(NULL),H264]::~ProxyServerMediaSubsession() > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyServerMediaSubsession[(NULL),MPEG4-GENERIC]::~ProxyServerMediaSubsession() > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 5)::deregisterRTPInterface(channel 255) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor::deregisterRTPInterface setting fDeleteMyselfNext > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading > turnOffBackgroundReadHandling(4294967295) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(4294967295, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading > turnOffBackgroundReadHandling(4294967295) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(4294967295, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 5)::deregisterRTPInterface(channel 0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 5)::deregisterRTPInterface(channel 255) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor::deregisterRTPInterface setting fDeleteMyselfNext > ^-- fDeleteMyselfNext is set > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading > turnOffBackgroundReadHandling(4294967295) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(4294967295, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTPInterface::stopNetworkReading > turnOffBackgroundReadHandling(4294967295) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(4294967295, 0, 0x0, 0x0) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: deregisterSocket sockNum: 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor(socket 5)::deregisterRTPInterface(channel 2) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[(NULL)]: Calling setBaseURL(fOurURL) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[rtsp://root:xxxxxx@192.168.0.35/axis-media/media.amp]: > Calling sendDESCRIBE(this) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient::sendDESCRIBE rtspClient == NULL: FALSE > Dec 26 16:20:15 Thor live555ProxyServer[27609]: RTSPClient::sendRequest > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::sendRequest - we need to open a connection > Dec 26 16:20:15 Thor live555ProxyServer[27609]: RTSPClient::openConnection > Dec 26 16:20:15 Thor live555ProxyServer[27609]: Opening connection to > 192.168.0.35, port 554... > Dec 26 16:20:15 Thor live555ProxyServer[27609]: Setting up > BackgroundHandling for socket 5 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::connectToServer setBackgroundHandling(5, > SOCKET_WRITABLE|SOCKET_EXCEPTION, connetionHandler, this) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(5, c, 0x40a250, 0x10b6430) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::sendRequest - connectResult:0 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::sendRequest - connectionIsPending:1 > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > ProxyRTSPClient[rtsp://root:xxxxxx@192.168.0.35/axis-media/media.amp]: > Reset done > ^-- Reset sequence in ProxyRTSPClient::continueAfterLivenessCommand finished > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor::tcpReadHandler fDeleteMyselfNext set > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > SocketDescriptor::~SocketDescriptor turnOffBackgroundReadHandling(5) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(5, 0, 0x0, 0x0) > ^-- Background handler reset again before the connection is reestablished > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > RTSPClient::handleAlternativeRequestByte1 setBackgroundHandling(5, > SOCKET_READABLE|SOCKET_EXCEPTION, incomingDataHandler, this) > Dec 26 16:20:15 Thor live555ProxyServer[27609]: > BasicTaskScheduler::setBackgroundHandling(5, a, 0x40d4f0, 0x10b6430) > Dec 26 16:20:20 Thor live555ProxyServer[27609]: > RTSPServer::RTSPClientConnection(0x189b340)::~RTSPClientConnection > Dec 26 16:20:20 Thor live555ProxyServer[27609]: > RTSPServer::RTSPClientConnection(0x189b340)::closeSocketsRTSP > Dec 26 16:20:20 Thor live555ProxyServer[27609]: > GenericMediaServer::ClientConnection::closeSockets > disableBackgroundHandling(9) > > /Erik _______________________________________________ live-devel mailing list live-devel@lists.live555.com http://lists.live555.com/mailman/listinfo/live-devel