diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 78be5ad2792ec42e8b0853f9b2f4a6ba6621ee08..48f89fd3d1cc8cf91af63e1dca1d753617f550e5 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -1154,7 +1154,15 @@ static void native_service_thread(void* arg)
 
 void DLLCALL services_terminate(void)
 {
+	DWORD i;
+
 	terminated=TRUE;
+	for(i=0;i<services;i++) {
+		if(service[i].socket==INVALID_SOCKET)
+			continue;
+		close_socket(service[i].socket);
+		service[i].socket=INVALID_SOCKET;
+	}
 }
 
 #define NEXT_FIELD(p)	while(*p && *p>' ') p++; while(*p && *p<=' ') p++;
@@ -1520,6 +1528,10 @@ void DLLCALL services_thread(void* arg)
 				if(service[i].socket>high_socket)
 					high_socket=service[i].socket;
 			}
+			if(high_socket==0) {	/* No dynamic services? */
+				YIELD();
+				continue;
+			}
 			tv.tv_sec=startup->sem_chk_freq;
 			tv.tv_usec=0;
 			if((result=select(high_socket+1,&socket_set,NULL,NULL,&tv))<1) {