diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c
index e309b1eae87742f45d53e78f306cb1b7972ab181..68fac9651770be38926ac702e57053d2da698558 100644
--- a/src/syncterm/rlogin.c
+++ b/src/syncterm/rlogin.c
@@ -212,11 +212,12 @@ int rlogin_close(void)
 	char garbage[1024];
 
 	conn_api.terminate=1;
-	closesocket(rlogin_sock);
+	shutdown(rlogin_sock, SHUT_RDWR);
 	while(conn_api.input_thread_running == 1 || conn_api.output_thread_running == 1) {
 		conn_recv_upto(garbage, sizeof(garbage), 0);
 		SLEEP(1);
 	}
+	closesocket(rlogin_sock);
 	destroy_conn_buf(&conn_inbuf);
 	destroy_conn_buf(&conn_outbuf);
 	FREE_AND_NULL(conn_api.rd_buf);
diff --git a/src/syncterm/ssh.c b/src/syncterm/ssh.c
index 0b45edaac5ecb2c67fa09a37f663e3352256d986..c9e46c390def9842ad4d829e0ffe1f5d1eacdfa7 100644
--- a/src/syncterm/ssh.c
+++ b/src/syncterm/ssh.c
@@ -355,6 +355,7 @@ int ssh_close(void)
 		SLEEP(1);
 	}
 	cl.DestroySession(ssh_session);
+	shutdown(SHUT_RDWR, ssh_sock);
 	closesocket(ssh_sock);
 	ssh_sock=INVALID_SOCKET;
 	destroy_conn_buf(&conn_inbuf);