diff -ur live/groupsock/GroupsockHelper.cpp live_tst_ok/groupsock/GroupsockHelper.cpp
--- live/groupsock/GroupsockHelper.cpp	2018-04-25 23:02:06.000000000 +0200
+++ live_tst_ok/groupsock/GroupsockHelper.cpp	2018-06-04 11:42:50.487999892 +0200
@@ -27,6 +27,7 @@
 #include <stdarg.h>
 #include <time.h>
 #include <sys/time.h>
+#include <netinet/tcp.h>
 #include <fcntl.h>
 #define initializeWinsockIfNecessary() 1
 #endif
@@ -174,6 +175,26 @@
   return newSocket;
 }
 
+Boolean setSocketKeepAlive(int sock) {
+  int keepalive_enabled = 1;
+  if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepalive_enabled, sizeof keepalive_enabled) < 0) {
+    return False;
+  }
+  int keepalive_time = 180;
+  if (setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&keepalive_time, sizeof keepalive_time) < 0) {
+    return False;
+  }
+  int keepalive_count = 5;
+  if (setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, (void*)&keepalive_count, sizeof keepalive_count) < 0) {
+    return False;
+  }
+  int keepalive_interval = 20;
+  if (setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, (void*)&keepalive_interval, sizeof keepalive_interval) < 0) {
+    return False;
+  }
+  return True;
+}
+
 Boolean makeSocketNonBlocking(int sock) {
 #if defined(__WIN32__) || defined(_WIN32)
   unsigned long arg = 1;
@@ -218,7 +239,7 @@
 }
 
 int setupStreamSocket(UsageEnvironment& env,
-                      Port port, Boolean makeNonBlocking) {
+                      Port port, Boolean makeNonBlocking, Boolean setKeepAlive) {
   if (!initializeWinsockIfNecessary()) {
     socketErr(env, "Failed to initialize 'winsock': ");
     return -1;
@@ -284,6 +305,18 @@
     }
   }
 
+  // set the keep alive mechanism for TCP socket to avoid that "ghost sockets" 
+  //    remain after an interrupted communication.
+  // #define SET_KEEP_ALIVE_FOR_TCP
+#ifdef SET_KEEP_ALIVE_FOR_TCP  
+  if (setKeepAlive) {
+    if (!setSocketKeepAlive(newSocket)) {
+      socketErr(env, "failed to set keep alive: ");
+      closeSocket(newSocket);
+      return -1;
+    }
+  }
+#endif
   return newSocket;
 }
 
diff -ur live/groupsock/include/GroupsockHelper.hh live_tst_ok/groupsock/include/GroupsockHelper.hh
--- live/groupsock/include/GroupsockHelper.hh	2018-04-25 23:02:06.000000000 +0200
+++ live_tst_ok/groupsock/include/GroupsockHelper.hh	2018-06-01 17:41:00.570734643 +0200
@@ -27,7 +27,7 @@
 
 int setupDatagramSocket(UsageEnvironment& env, Port port);
 int setupStreamSocket(UsageEnvironment& env,
-		      Port port, Boolean makeNonBlocking = True);
+		      Port port, Boolean makeNonBlocking = True, Boolean setKeepAlive = False);
 
 int readSocket(UsageEnvironment& env,
 	       int socket, unsigned char* buffer, unsigned bufferSize,
@@ -56,6 +56,7 @@
 unsigned increaseReceiveBufferTo(UsageEnvironment& env,
 				 int socket, unsigned requestedSize);
 
+Boolean setSocketKeepAlive(int sock);
 Boolean makeSocketNonBlocking(int sock);
 Boolean makeSocketBlocking(int sock, unsigned writeTimeoutInMilliseconds = 0);
   // A "writeTimeoutInMilliseconds" value of 0 means: Don't timeout
diff -ur live/liveMedia/GenericMediaServer.cpp live_tst_ok/liveMedia/GenericMediaServer.cpp
--- live/liveMedia/GenericMediaServer.cpp	2018-04-25 23:02:06.000000000 +0200
+++ live_tst_ok/liveMedia/GenericMediaServer.cpp	2018-06-01 17:12:37.010203363 +0200
@@ -149,7 +149,7 @@
     NoReuse dummy(env); // Don't use this socket if there's already a local server using it
 #endif
     
-    ourSocket = setupStreamSocket(env, ourPort);
+    ourSocket = setupStreamSocket(env, ourPort, True, True);
     if (ourSocket < 0) break;
     
     // Make sure we have a big send buffer:
