diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c
index 215100195fdef5e82788c7466cca3558c71c3101..5bc18fbc79e55af0a103fd7f7063a7312f287789 100644
--- a/src/syncterm/conn.c
+++ b/src/syncterm/conn.c
@@ -484,7 +484,7 @@ enum failure_reason {
 };
 
 SOCKET
-conn_socket_connect(struct bbslist *bbs)
+conn_socket_connect(struct bbslist *bbs, bool can_cancel)
 {
 	SOCKET           sock = INVALID_SOCKET;
 #ifdef _WIN32
@@ -531,9 +531,11 @@ conn_socket_connect(struct bbslist *bbs)
 		uifc.pop("Connecting...");
 	}
 
-        /* Drain the input buffer to avoid accidental cancel */
-	while (kbhit())
-		getch();
+	if (can_cancel) {
+		/* Drain the input buffer to avoid accidental cancel */
+		while (kbhit())
+			getch();
+	}
 
 	for (cur = res; cur && sock == INVALID_SOCKET && failcode == FAILURE_WHAT_FAILURE; cur = cur->ai_next) {
 		if (sock == INVALID_SOCKET) {
@@ -549,6 +551,7 @@ conn_socket_connect(struct bbslist *bbs)
 		}
 
 		if (connect(sock, cur->ai_addr, cur->ai_addrlen)) {
+			int tries = 0;
 			switch (ERROR_VALUE) {
 				case EINPROGRESS:
 				case EINTR:
@@ -558,7 +561,13 @@ conn_socket_connect(struct bbslist *bbs)
 #endif
 					for (; sock != INVALID_SOCKET;) {
 						if (socket_writable(sock, 1000)) {
-							if (socket_recvdone(sock, 0)) {
+							tries++;
+							if (tries >= 5 && !can_cancel)  {
+								closesocket(sock);
+								sock = INVALID_SOCKET;
+								continue;
+							}
+							else if (socket_recvdone(sock, 0)) {
 								closesocket(sock);
 								sock = INVALID_SOCKET;
 								continue;
@@ -568,10 +577,12 @@ conn_socket_connect(struct bbslist *bbs)
 							}
 						}
 						else {
-							if (kbhit()) {
-								failcode = FAILURE_ABORTED;
-								closesocket(sock);
-								sock = INVALID_SOCKET;
+							if (can_cancel) {
+								if (kbhit()) {
+									failcode = FAILURE_ABORTED;
+									closesocket(sock);
+									sock = INVALID_SOCKET;
+								}
 							}
 						}
 					}
diff --git a/src/syncterm/conn.h b/src/syncterm/conn.h
index 3c7a1275e1afdf435887989d249f97b79c3a529f..fb5893c9b067322b5395b8ed0a83fe75c0ab3383 100644
--- a/src/syncterm/conn.h
+++ b/src/syncterm/conn.h
@@ -124,6 +124,6 @@ size_t conn_buf_wait_cond(struct conn_buffer *buf, size_t bcount, unsigned long
 
 #define conn_buf_wait_bytes(buf, count, timeout) conn_buf_wait_cond(buf, count, timeout, 0)
 #define conn_buf_wait_free(buf, count, timeout) conn_buf_wait_cond(buf, count, timeout, 1)
-SOCKET conn_socket_connect(struct bbslist *bbs);
+SOCKET conn_socket_connect(struct bbslist *bbs, bool can_cancel);
 
 #endif // ifndef _CONN_H_
diff --git a/src/syncterm/conn_telnet.c b/src/syncterm/conn_telnet.c
index ba6e7e102f47fd840c3c391ac268519e845f70e7..4e4a0430703fe775bd61b7d415cb28a5d1ef4d87 100644
--- a/src/syncterm/conn_telnet.c
+++ b/src/syncterm/conn_telnet.c
@@ -118,7 +118,7 @@ telnet_connect(struct bbslist *bbs)
 
 	telnet_log_level = bbs->telnet_loglevel;
 
-	rlogin_sock = conn_socket_connect(bbs);
+	rlogin_sock = conn_socket_connect(bbs, true);
 	if (rlogin_sock == INVALID_SOCKET)
 		return -1;
 
diff --git a/src/syncterm/rlogin.c b/src/syncterm/rlogin.c
index cba629cecdf0a8d04085c64f089c60ae692ca9f5..bfb0a587d68841c553aeefc09e7b6f2d4f0c4380 100644
--- a/src/syncterm/rlogin.c
+++ b/src/syncterm/rlogin.c
@@ -109,7 +109,7 @@ rlogin_connect(struct bbslist *bbs)
 		ruser = bbs->password;
 	}
 
-	rlogin_sock = conn_socket_connect(bbs);
+	rlogin_sock = conn_socket_connect(bbs, true);
 	if (rlogin_sock == INVALID_SOCKET)
 		return -1;
 
diff --git a/src/syncterm/ssh.c b/src/syncterm/ssh.c
index a2bb9ec7dd1976ac00f113086bd081362d58c218..cfe0ad8a55e340066c7f8d6617efc475bd87f3bd 100644
--- a/src/syncterm/ssh.c
+++ b/src/syncterm/ssh.c
@@ -784,7 +784,7 @@ ssh_connect(struct bbslist *bbs)
 		ssh_context = -1;
 	}
 
-	ssh_sock = conn_socket_connect(bbs);
+	ssh_sock = conn_socket_connect(bbs, true);
 	if (ssh_sock == INVALID_SOCKET)
 		return -1;
 
diff --git a/src/syncterm/telnets.c b/src/syncterm/telnets.c
index 6f354c3f82f647368c92eb394b9be5cc2dc320d6..bafad845010ddae7dfdb481b71e790d4464c203a 100644
--- a/src/syncterm/telnets.c
+++ b/src/syncterm/telnets.c
@@ -156,7 +156,7 @@ telnets_connect(struct bbslist *bbs)
 		init_uifc(true, true);
 	assert_pthread_mutex_init(&telnets_mutex, NULL);
 
-	telnets_sock = conn_socket_connect(bbs);
+	telnets_sock = conn_socket_connect(bbs, true);
 	if (telnets_sock == INVALID_SOCKET)
 		return -1;
 
diff --git a/src/syncterm/webget.c b/src/syncterm/webget.c
index fba7e80ff3f4ff70984c35e302360b0f95feaeed..ea409b090d9953155043b3a5e99e43e46364b1ff 100644
--- a/src/syncterm/webget.c
+++ b/src/syncterm/webget.c
@@ -11,7 +11,6 @@
 #include "sockwrap.h"
 #include "stdio.h"
 #include "syncterm.h"
-#include "uifcinit.h"
 #include "webget.h"
 #include "xpprintf.h"
 
@@ -999,7 +998,7 @@ do_request(struct http_session *sess)
 	if (!parse_uri(sess))
 		goto error_return;
 	set_state(sess->req, "Connecting");
-	sess->sock = conn_socket_connect(&sess->hacky_list_entry);
+	sess->sock = conn_socket_connect(&sess->hacky_list_entry, false);
 	if (sess->sock == INVALID_SOCKET) {
 		set_msg(sess->req, "Connection Failed");
 		goto error_return;
@@ -1113,6 +1112,7 @@ bool
 iniReadHttp(struct webget_request *req)
 {
 	struct http_session sess = {
+		.sock = INVALID_SOCKET,
 		.req = req,
 		.tls = -1,
 		.hacky_list_entry = {
@@ -1193,6 +1193,8 @@ destroy_webget_req(struct webget_request *req)
 }
 
 #if 0
+#include "uifcinit.h"
+
 int
 main(int argc, char **argv)
 {