diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c
index 0ae44b150c72b6eb85631316f3c507a71b4cb0b0..d3e261e0d68dc5abbfc10561bd86cf4c1206ad5a 100644
--- a/src/syncterm/rlogin.c
+++ b/src/syncterm/rlogin.c
@@ -5,6 +5,8 @@
 
 static SOCKET	rlogin_socket=INVALID_SOCKET;
 
+int	rcvtimeo=1;
+
 int rlogin_recv(char *buffer, size_t buflen)
 {
 	int	r;
@@ -51,7 +53,6 @@ int rlogin_connect(char *addr, int port, char *ruser, char *passwd, int bedumb)
 	char	nil=0;
 	char	*p;
 	unsigned int	neta;
-	unsigned long	l;
 
 	for(p=addr;*p;p++)
 		if(*p!='.' && !isdigit(*p))
@@ -93,9 +94,22 @@ int rlogin_connect(char *addr, int port, char *ruser, char *passwd, int bedumb)
 		return(-1);
 	}
 
-	l=1;
-	ioctlsocket(rlogin_socket, FIONBIO,&l);
-	/* fcntl(rlogin_socket, F_SETFL, fcntl(rlogin_socket, F_GETFL)|O_NONBLOCK); */
+	if(rcvtimeo) {
+		#ifdef _WIN32
+		int	tv=10;
+		#else
+		struct timeval tv;
+
+		tv.tv_sec=0;
+		tv.tv_usec=10000;
+		#endif
+
+		setsockopt(rlogin_socket,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));
+	}
+	else {
+		unsigned long	l=1;
+		ioctlsocket(rlogin_socket, FIONBIO,&l);
+	}
 
 	if(!bedumb) {
 		rlogin_send("",1,1000);
diff --git a/src/syncterm/rlogin.h b/src/syncterm/rlogin.h
index 3375654803b890e96a13f950cd6a0d4beef1af82..7db1ae18fee75ec71936112da07378e624dbe71a 100644
--- a/src/syncterm/rlogin.h
+++ b/src/syncterm/rlogin.h
@@ -4,6 +4,7 @@
 #include <sockwrap.h>
 
 extern SOCKET	rlogin_socket;
+extern int	rcvtimeo;
 
 int rlogin_recv(char *buffer, size_t buflen);
 int rlogin_send(char *buffer, size_t buflen, unsigned int timeout);
diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index af5eb0bec7db7880eaf99afb86e9b846d56a7026..648eefbf80c4be345f5c733010e43c8fc21b0ba2 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -2,6 +2,7 @@
 #include <ciolib.h>
 #include <keys.h>
 
+#include "rlogin.h"
 #include "term.h"
 #include "uifcinit.h"
 #include "menu.h"
@@ -117,6 +118,7 @@ void doterm(void)
 					
 			}
 		}
-		SLEEP(1);
+		if(!rcvtimeo)
+			SLEEP(1);
 	}
 }