diff --git a/libvncclient/sockets.c b/libvncclient/sockets.c
index 334928e5230d6bcc6c3561e188fcd4258cb99ed9..4183192c620b3c755b8ea15307b63649d9df72a7 100644
--- a/libvncclient/sockets.c
+++ b/libvncclient/sockets.c
@@ -262,6 +262,9 @@ WriteToRFBServer(rfbClient* client, char *buf, int n)
     j = write(client->sock, buf + i, (n - i));
     if (j <= 0) {
       if (j < 0) {
+#ifdef WIN32
+	 errno=WSAGetLastError();
+#endif
 	if (errno == EWOULDBLOCK ||
 #ifdef LIBVNCSERVER_ENOENT_WORKAROUND
 		errno == ENOENT ||
@@ -735,8 +738,12 @@ int WaitForMessage(rfbClient* client,unsigned int usecs)
   FD_SET(client->sock,&fds);
 
   num=select(client->sock+1, &fds, NULL, NULL, &timeout);
-  if(num<0)
+  if(num<0) {
+#ifdef WIN32
+    errno=WSAGetLastError();
+#endif
     rfbClientLog("Waiting for message failed: %d (%s)\n",errno,strerror(errno));
+  }
 
   return num;
 }
diff --git a/libvncclient/tls.c b/libvncclient/tls.c
index 206dbda3cbfcc3421003febbab6fcc33d7b5e161..eb894133c5a8e0f1052ffb31482d8ad683bc023d 100644
--- a/libvncclient/tls.c
+++ b/libvncclient/tls.c
@@ -62,6 +62,9 @@ PushTLS(gnutls_transport_ptr_t transport, const void *data, size_t len)
     ret = write(client->sock, data, len);
     if (ret < 0)
     {
+#ifdef WIN32
+      errno=WSAGetLastError();
+#endif
       if (errno == EINTR) continue;
       return -1;
     }
@@ -81,6 +84,9 @@ PullTLS(gnutls_transport_ptr_t transport, void *data, size_t len)
     ret = read(client->sock, data, len);
     if (ret < 0)
     {
+#ifdef WIN32
+      errno=WSAGetLastError();
+#endif
       if (errno == EINTR) continue;
       return -1;
     }
diff --git a/libvncserver/httpd.c b/libvncserver/httpd.c
index 320e6d22a6747428b1a85d2b2b5977afcfec138c..ad2a51b8209d3f157bdb293bd870021281ad62ec 100755
--- a/libvncserver/httpd.c
+++ b/libvncserver/httpd.c
@@ -269,6 +269,9 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen)
 	    if (got == 0) {
 		rfbErr("httpd: premature connection close\n");
 	    } else {
+#ifdef WIN32
+	        errno=WSAGetLastError();
+#endif
 		if (errno == EAGAIN) {
 		    return;
 		}
diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c
index 554c1189630209ae2beeabca32a46bd6df845074..73be34cb8a8cc70a19ff10d85b928d8e1cfed87d 100644
--- a/libvncserver/rfbserver.c
+++ b/libvncserver/rfbserver.c
@@ -1350,6 +1350,9 @@ rfbBool rfbSendFileTransferChunk(rfbClientPtr cl)
 	n = select(cl->sock + 1, NULL, &wfds, NULL, &tv);
 
 	if (n<0) {
+#ifdef WIN32
+	    errno=WSAGetLastError();
+#endif
             rfbLog("rfbSendFileTransferChunk() select failed: %s\n", strerror(errno));
 	}
         /* We have space on the transmit queue */
@@ -1369,6 +1372,9 @@ rfbBool rfbSendFileTransferChunk(rfbClientPtr cl)
                 return retval;
             case -1:
                 /* TODO : send an error msg to the client... */
+#ifdef WIN32
+	        errno=WSAGetLastError();
+#endif
                 rfbLog("rfbSendFileTransferChunk(): %s\n",strerror(errno));
                 retval = rfbSendFileTransferMessage(cl, rfbAbortFileTransfer, 0, 0, 0, NULL);
                 close(cl->fileTransfer.fd);
diff --git a/libvncserver/sockets.c b/libvncserver/sockets.c
index 48d024c3639c56f7b96fa0b3ed69328e9e44733a..e1c5a7f9350ed82158f07ba299ab1df38703c631 100755
--- a/libvncserver/sockets.c
+++ b/libvncserver/sockets.c
@@ -567,6 +567,9 @@ rfbWriteExact(rfbClientPtr cl,
             tv.tv_usec = 0;
             n = select(sock+1, NULL, &fds, NULL /* &fds */, &tv);
 	    if (n < 0) {
+#ifdef WIN32
+                errno=WSAGetLastError();
+#endif
        	        if(errno==EINTR)
 		    continue;
                 rfbLogPerror("WriteExact: select");