diff -pru livemedia.2017.01.26_org/BasicUsageEnvironment/BasicTaskScheduler.cpp livemedia.2017.01.26_patch_submit/BasicUsageEnvironment/BasicTaskScheduler.cpp
--- livemedia.2017.01.26_org/BasicUsageEnvironment/BasicTaskScheduler.cpp	2017-01-26 12:29:37.000000000 +0100
+++ livemedia.2017.01.26_patch_submit/BasicUsageEnvironment/BasicTaskScheduler.cpp	2017-02-25 08:32:38.029236769 +0100
@@ -25,7 +25,7 @@ along with this library; if not, write t
 #include <sys/select.h>
 #include <unix.h>
 #endif
-
+#include <fcntl.h>
 ////////// BasicTaskScheduler //////////
 
 BasicTaskScheduler* BasicTaskScheduler::createNew(unsigned maxSchedulerGranularity) {
@@ -111,12 +111,13 @@ void BasicTaskScheduler::SingleStep(unsi
 	// that had already been closed) being used in "select()" - we print out the sockets that were being used in "select()",
 	// to assist in debugging:
 	fprintf(stderr, "socket numbers used in the select() call:");
-	for (int i = 0; i < 10000; ++i) {
+	for (int i = 0; i < FD_SETSIZE; ++i) {
 	  if (FD_ISSET(i, &fReadSet) || FD_ISSET(i, &fWriteSet) || FD_ISSET(i, &fExceptionSet)) {
 	    fprintf(stderr, " %d(", i);
 	    if (FD_ISSET(i, &fReadSet)) fprintf(stderr, "r");
 	    if (FD_ISSET(i, &fWriteSet)) fprintf(stderr, "w");
 	    if (FD_ISSET(i, &fExceptionSet)) fprintf(stderr, "e");
+	    fprintf(stderr, ", F_GETFD:%d",fcntl(i, F_GETFD));
 	    fprintf(stderr, ")");
 	  }
 	}
diff -pru livemedia.2017.01.26_org/liveMedia/include/ProxyServerMediaSession.hh livemedia.2017.01.26_patch_submit/liveMedia/include/ProxyServerMediaSession.hh
--- livemedia.2017.01.26_org/liveMedia/include/ProxyServerMediaSession.hh	2017-01-26 12:29:37.000000000 +0100
+++ livemedia.2017.01.26_patch_submit/liveMedia/include/ProxyServerMediaSession.hh	2017-02-25 12:48:30.488561316 +0100
@@ -55,6 +55,7 @@ public:
 private:
   void reset();
   int connectToServer(int socketNum, portNumBits remotePortNum);
+  void handleAlternativeRequestByte1(u_int8_t requestByte);
 
   Authenticator* auth() { return fOurAuthenticator; }
 
@@ -164,6 +165,7 @@ private:
   friend class ProxyServerMediaSubsession;
   void continueAfterDESCRIBE(char const* sdpDescription);
   void resetDESCRIBEState(); // undoes what was done by "contineAfterDESCRIBE()"
+  void closeClientSessions(); // Close any client connections that may have already been set up
 
 private:
   int fVerbosityLevel;
diff -pru livemedia.2017.01.26_org/liveMedia/include/RTSPClient.hh livemedia.2017.01.26_patch_submit/liveMedia/include/RTSPClient.hh
--- livemedia.2017.01.26_org/liveMedia/include/RTSPClient.hh	2017-01-26 12:29:37.000000000 +0100
+++ livemedia.2017.01.26_patch_submit/liveMedia/include/RTSPClient.hh	2017-02-25 08:34:12.213232625 +0100
@@ -246,7 +246,7 @@ protected:
 				   char*& extraHeaders, Boolean& extraHeadersWereAllocated);
       // used to implement "sendRequest()"; subclasses may reimplement this (e.g., when implementing a new command name)
   virtual int connectToServer(int socketNum, portNumBits remotePortNum); // used to implement "openConnection()"; result values: -1: failure; 0: pending; 1: success
-
+  virtual void handleAlternativeRequestByte1(u_int8_t requestByte);
 private: // redefined virtual functions
   virtual Boolean isRTSPClient() const;
 
@@ -295,7 +295,6 @@ private:
   Boolean resendCommand(RequestRecord* request);
   char const* sessionURL(MediaSession const& session) const;
   static void handleAlternativeRequestByte(void*, u_int8_t requestByte);
-  void handleAlternativeRequestByte1(u_int8_t requestByte);
   void constructSubsessionURL(MediaSubsession const& subsession,
 			      char const*& prefix,
 			      char const*& separator,
diff -pru livemedia.2017.01.26_org/liveMedia/ProxyServerMediaSession.cpp livemedia.2017.01.26_patch_submit/liveMedia/ProxyServerMediaSession.cpp
--- livemedia.2017.01.26_org/liveMedia/ProxyServerMediaSession.cpp	2017-01-26 12:29:37.000000000 +0100
+++ livemedia.2017.01.26_patch_submit/liveMedia/ProxyServerMediaSession.cpp	2017-02-25 12:50:55.568554933 +0100
@@ -191,6 +191,12 @@ void ProxyServerMediaSession::resetDESCR
   Medium::close(fClientMediaSession); fClientMediaSession = NULL;
 }
 
+void ProxyServerMediaSession::closeClientSessions() {
+  if (fOurMediaServer != NULL) {
+    // Close any client connections that may have already been set up:
+    fOurMediaServer->closeAllClientSessionsForServerMediaSession(this);
+  }
+}
 ///////// RTSP 'response handlers' //////////
 
 static void continueAfterDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString) {
@@ -293,6 +299,20 @@ int ProxyRTSPClient::connectToServer(int
   return res;
 }
 
+void ProxyRTSPClient::handleAlternativeRequestByte1(u_int8_t requestByte) {
+  if (requestByte == 0xFF || requestByte == 0xFE) {
+    fprintf(stderr, "ProxyRTSPClient[%p]::handleAlternativeRequestByte1 %x, fDoneDESCRIBE: %u, fStreamRTPOverTCP: %u\n", this, requestByte, fDoneDESCRIBE, fStreamRTPOverTCP);
+    if (fDoneDESCRIBE && fStreamRTPOverTCP) {
+      // Hack: The handler of the input TCP socket encountered an error reading or writing it. Close any client connections.
+      if (fVerbosityLevel > 0) {
+        envir() << "ProxyRTSPClient::handleAlternativeRequestByte1 calling fOurServerMediaSession.closeClientSessions()\n";
+      }
+      fOurServerMediaSession.closeClientSessions();
+    }
+  }
+  RTSPClient::handleAlternativeRequestByte1(requestByte);
+}
+
 void ProxyRTSPClient::continueAfterDESCRIBE(char const* sdpDescription) {
   if (sdpDescription != NULL) {
     fOurServerMediaSession.continueAfterDESCRIBE(sdpDescription);
