diff --git a/lib/client-handshake.c b/lib/client-handshake.c
index 6bce8fe52d3c3af1de0970e648e154a547073d03..d87d21027ccbca80403d43618d351d2dd4ef9627 100644
--- a/lib/client-handshake.c
+++ b/lib/client-handshake.c
@@ -93,9 +93,9 @@ struct libwebsocket *libwebsocket_client_connect_2(
 	bzero(&server_addr.sin_zero, 8);
 
 	if (connect(wsi->sock, (struct sockaddr *)&server_addr,
-			  sizeof(struct sockaddr)) == -1 || errno == EISCONN)  {
+			  sizeof(struct sockaddr)) == -1 || LWS_ERRNO == LWS_EISCONN)  {
 
-		if (errno == EALREADY || errno == EINPROGRESS) {
+		if (LWS_ERRNO == LWS_EALREADY || LWS_ERRNO == LWS_EINPROGRESS) {
 			lwsl_client("nonblocking connect retry\n");
 
 			/*
@@ -107,9 +107,9 @@ struct libwebsocket *libwebsocket_client_connect_2(
 			return wsi;
 		}
 
-		if (errno != EISCONN) {
+		if (LWS_ERRNO != LWS_EISCONN) {
 		
-			lwsl_debug("Connect failed errno=%d\n", errno);
+			lwsl_debug("Connect failed errno=%d\n", LWS_ERRNO);
 			goto failed;
 		}
 	}
diff --git a/lib/client.c b/lib/client.c
index 4775555ada5a7b8f10d29c66a6965e9e56cdacfd..729e9b3821b23f54d19a84c62c9972bdfc9252c2 100644
--- a/lib/client.c
+++ b/lib/client.c
@@ -78,7 +78,7 @@ int lws_client_socket_service(struct libwebsocket_context *context,
 					sizeof(context->service_buffer), 0);
 		if (n < 0) {
 			
-			if (errno == EAGAIN) {
+			if (LWS_ERRNO == LWS_EAGAIN) {
 				lwsl_debug(
 						   "Proxy read returned EAGAIN... retrying\n");
 				return 0;
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index 0b5c309fc78956e58c8fe8f2eff1dcb3dc9934ce..a280f8aaefe9e5a56549a560af94b9562a211947 100644
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -523,12 +523,12 @@ just_kill_connection:
 			n = shutdown(wsi->sock, SHUT_RDWR);
 			if (n)
 				lwsl_debug("closing: shutdown returned %d\n",
-									errno);
+									LWS_ERRNO);
 
 			n = compatible_close(wsi->sock);
 			if (n)
 				lwsl_debug("closing: close returned %d\n",
-									errno);
+									LWS_ERRNO);
 		}
 #ifdef LWS_OPENSSL_SUPPORT
 	}
@@ -585,14 +585,14 @@ libwebsockets_get_peer_addresses(struct libwebsocket_context *context,
 
 	len = sizeof(sin);
 	if (getpeername(fd, (struct sockaddr *) &sin, &len) < 0) {
-		lwsl_warn("getpeername: %s\n", strerror(errno));
+		lwsl_warn("getpeername: %s\n", strerror(LWS_ERRNO));
 		goto bail;
 	}
 
 	host = gethostbyaddr((char *) &sin.sin_addr, sizeof(sin.sin_addr),
 								       AF_INET);
 	if (host == NULL) {
-		lwsl_warn("gethostbyaddr: %s\n", strerror(errno));
+		lwsl_warn("gethostbyaddr: %s\n", strerror(LWS_ERRNO));
 		goto bail;
 	}
 
@@ -1149,8 +1149,8 @@ read_pending:
 
 		if (eff_buf.token_len < 0) {
 			lwsl_debug("service_fd read ret = %d, errno = %d\n",
-						      eff_buf.token_len, errno);
-			if (errno != EINTR && errno != EAGAIN)
+						      eff_buf.token_len, LWS_ERRNO);
+			if (LWS_ERRNO != LWS_EINTR && LWS_ERRNO != LWS_EAGAIN)
 				goto close_and_handled;
 			n = 0;
 			goto handled;
@@ -1425,7 +1425,7 @@ libwebsocket_service(struct libwebsocket_context *context, int timeout_ms)
 	}
 
 	if (n < 0) {
-		if (errno != EINTR)
+		if (LWS_ERRNO != LWS_EINTR)
 			return -1;
 		else
 			return 0;
@@ -2428,7 +2428,7 @@ libwebsocket_create_context(struct lws_context_creation_info *info)
 							     sizeof(serv_addr));
 		if (n < 0) {
 			lwsl_err("ERROR on binding to port %d (%d %d)\n",
-							info->port, n, errno);
+							info->port, n, LWS_ERRNO);
 			compatible_close(sockfd);
 			goto bail;
 		}
@@ -2467,10 +2467,10 @@ libwebsocket_create_context(struct lws_context_creation_info *info)
 #else
 	if (info->gid != -1)
 		if (setgid(info->gid))
-			lwsl_warn("setgid: %s\n", strerror(errno));
+			lwsl_warn("setgid: %s\n", strerror(LWS_ERRNO));
 	if (info->uid != -1)
 		if (setuid(info->uid))
-			lwsl_warn("setuid: %s\n", strerror(errno));
+			lwsl_warn("setuid: %s\n", strerror(LWS_ERRNO));
 #endif
 
 	/* initialize supported protocols */
diff --git a/lib/output.c b/lib/output.c
index 4b5d948c38b18b0135e091b6576d05bcaa22d07d..a835ec3914c36cc1c4398a37f451e89c3f67649e 100644
--- a/lib/output.c
+++ b/lib/output.c
@@ -156,7 +156,7 @@ int lws_issue_raw(struct libwebsocket *wsi, unsigned char *buf, size_t len)
 		n = SSL_write(wsi->ssl, buf, len);
 		lws_latency(context, wsi, "SSL_write lws_issue_raw", n, n >= 0);
 		if (n < 0) {
-			if (errno == EAGAIN || errno == EINTR) {
+			if (LWS_ERRNO == LWS_EAGAIN || LWS_ERRNO == LWS_EINTR) {
 				n = 0;
 				goto handle_truncated_send;
 			}
@@ -168,7 +168,7 @@ int lws_issue_raw(struct libwebsocket *wsi, unsigned char *buf, size_t len)
 		n = send(wsi->sock, buf, len, MSG_NOSIGNAL);
 		lws_latency(context, wsi, "send lws_issue_raw", n, n == len);
 		if (n < 0) {
-			if (errno == EAGAIN || errno == EINTR) {
+			if (LWS_ERRNO == LWS_EAGAIN || LWS_ERRNO == LWS_EINTR) {
 				n = 0;
 				goto handle_truncated_send;
 			}
diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h
index c325c9be472b27e8446d3061b6fdc95be3f09c3e..ed2ff3b99389d0a597a48868f4659f62404ea5ab 100644
--- a/lib/private-libwebsockets.h
+++ b/lib/private-libwebsockets.h
@@ -61,18 +61,13 @@
 
 #if defined(WIN32) || defined(_WIN32)
 #define LWS_NO_DAEMONIZE
-#ifndef EWOULDBLOCK
-#define EWOULDBLOCK EAGAIN
-#endif
-#ifndef EALREADY
-#define EALREADY WSAEALREADY
-#endif
-#ifndef EINPROGRESS
-#define EINPROGRESS WSAEINPROGRESS
-#endif
-#ifndef EISCONN
-#define EISCONN WSAEISCONN
-#endif
+#define LWS_ERRNO WSAGetLastError()
+#define LWS_EAGAIN WSAEWOULDBLOCK
+#define LWS_EALREADY WSAEALREADY
+#define LWS_EINPROGRESS WSAEINPROGRESS
+#define LWS_EINTR WSAEINTR
+#define LWS_EISCONN WSAEISCONN
+#define LWS_EWOULDBLOCK WSAEWOULDBLOCK
 
 #define compatible_close(fd) closesocket(fd);
 #ifdef __MINGW64__
@@ -103,6 +98,13 @@
 #include <sys/mman.h>
 #include <sys/time.h>
 
+#define LWS_ERRNO errno
+#define LWS_EAGAIN EAGAIN
+#define LWS_EALREADY EALREADY
+#define LWS_EINPROGRESS EINPROGRESS
+#define LWS_EINTR EINTR
+#define LWS_EISCONN EISCONN
+#define LWS_EWOULDBLOCK EWOULDBLOCK
 #define LWS_INVALID_FILE -1
 #define compatible_close(fd) close(fd);
 #endif
diff --git a/lib/server.c b/lib/server.c
index 749cec06c3cea807b652b1c814e257f004fa3d7a..2f2c5b3822637b12c56b26a13028698d68426cfd 100644
--- a/lib/server.c
+++ b/lib/server.c
@@ -153,7 +153,7 @@ int lws_server_socket_service(struct libwebsocket_context *context,
 
 			if (len < 0) {
 				lwsl_debug("Socket read returned %d\n", len);
-				if (errno != EINTR && errno != EAGAIN)
+				if (LWS_ERRNO != LWS_EINTR && LWS_ERRNO != LWS_EAGAIN)
 					libwebsocket_close_and_free_session(
 						context, wsi,
 						LWS_CLOSE_STATUS_NOSTATUS);
@@ -226,11 +226,11 @@ int lws_server_socket_service(struct libwebsocket_context *context,
 			"unencrypted accept LWS_CONNMODE_SERVER_LISTENER",
 						     accept_fd, accept_fd >= 0);
 		if (accept_fd < 0) {
-			if (errno == EAGAIN || errno == EWOULDBLOCK) {
+			if (LWS_ERRNO == LWS_EAGAIN || LWS_ERRNO == LWS_EWOULDBLOCK) {
 				lwsl_debug("accept asks to try again\n");
 				break;
 			}
-			lwsl_warn("ERROR on accept: %s\n", strerror(errno));
+			lwsl_warn("ERROR on accept: %s\n", strerror(LWS_ERRNO));
 			break;
 		}
 
diff --git a/win32port/win32helpers/websock-w32.c b/win32port/win32helpers/websock-w32.c
index ec3022e93d6f490bde25eff01876151a5f2a14eb..a919c4b07265357e04d50b44ef1cb9e865f7a9ad 100644
--- a/win32port/win32helpers/websock-w32.c
+++ b/win32port/win32helpers/websock-w32.c
@@ -11,7 +11,6 @@
 #endif
 
 #include <stdlib.h>
-#include <errno.h>
 #include "websock-w32.h"
 
 PFNWSAPOLL poll = NULL;
@@ -29,7 +28,7 @@ INT WSAAPI emulated_poll(LPWSAPOLLFD fdarray, ULONG nfds, INT timeout)
 	WSAPOLLFD * poll_fd = fdarray;
 
 	if (NULL == fdarray) {
-		errno = EFAULT;
+		WSASetLastError(WSAEFAULT);
 		return -1;
 	}