diff --git a/src/backend/port/win32/socket.c b/src/backend/port/win32/socket.c
index f82553fca64426a2a652b47ad2d2093c6498f7bb..2db5a7fe4aa36b1f83955a3952486098ad0b659d 100644
--- a/src/backend/port/win32/socket.c
+++ b/src/backend/port/win32/socket.c
@@ -44,23 +44,38 @@ int			pgwin32_noblock = 0;
 
 /*
  * Convert the last socket error code into errno
+ *
+ * Note: where there is a direct correspondence between a WSAxxx error code
+ * and a Berkeley error symbol, this mapping is actually a no-op, because
+ * in win32.h we redefine the network-related Berkeley error symbols to have
+ * the values of their WSAxxx counterparts.  The point of the switch is
+ * mostly to translate near-miss error codes into something that's sensible
+ * in the Berkeley universe.
  */
 static void
 TranslateSocketError(void)
 {
 	switch (WSAGetLastError())
 	{
-		case WSANOTINITIALISED:
-		case WSAENETDOWN:
-		case WSAEINPROGRESS:
 		case WSAEINVAL:
-		case WSAESOCKTNOSUPPORT:
-		case WSAEFAULT:
+		case WSANOTINITIALISED:
 		case WSAEINVALIDPROVIDER:
 		case WSAEINVALIDPROCTABLE:
-		case WSAEMSGSIZE:
+		case WSAEDESTADDRREQ:
 			errno = EINVAL;
 			break;
+		case WSAEINPROGRESS:
+			errno = EINPROGRESS;
+			break;
+		case WSAEFAULT:
+			errno = EFAULT;
+			break;
+		case WSAEISCONN:
+			errno = EISCONN;
+			break;
+		case WSAEMSGSIZE:
+			errno = EMSGSIZE;
+			break;
 		case WSAEAFNOSUPPORT:
 			errno = EAFNOSUPPORT;
 			break;
@@ -72,16 +87,23 @@ TranslateSocketError(void)
 			break;
 		case WSAEPROTONOSUPPORT:
 		case WSAEPROTOTYPE:
+		case WSAESOCKTNOSUPPORT:
 			errno = EPROTONOSUPPORT;
 			break;
+		case WSAECONNABORTED:
+			errno = ECONNABORTED;
+			break;
 		case WSAECONNREFUSED:
 			errno = ECONNREFUSED;
 			break;
+		case WSAECONNRESET:
+			errno = ECONNRESET;
+			break;
 		case WSAEINTR:
 			errno = EINTR;
 			break;
 		case WSAENOTSOCK:
-			errno = EBADFD;
+			errno = ENOTSOCK;
 			break;
 		case WSAEOPNOTSUPP:
 			errno = EOPNOTSUPP;
@@ -92,13 +114,24 @@ TranslateSocketError(void)
 		case WSAEACCES:
 			errno = EACCES;
 			break;
-		case WSAENOTCONN:
+		case WSAEADDRINUSE:
+			errno = EADDRINUSE;
+			break;
+		case WSAEADDRNOTAVAIL:
+			errno = EADDRNOTAVAIL;
+			break;
+		case WSAEHOSTUNREACH:
+		case WSAEHOSTDOWN:
+		case WSAHOST_NOT_FOUND:
+		case WSAENETDOWN:
+		case WSAENETUNREACH:
 		case WSAENETRESET:
-		case WSAECONNRESET:
+			errno = EHOSTUNREACH;
+			break;
+		case WSAENOTCONN:
 		case WSAESHUTDOWN:
-		case WSAECONNABORTED:
 		case WSAEDISCON:
-			errno = ECONNREFUSED;		/* ENOTCONN? */
+			errno = ENOTCONN;
 			break;
 		default:
 			ereport(NOTICE,
diff --git a/src/include/port/win32.h b/src/include/port/win32.h
index 0a9789303143475cfce2e63c374ef4c9a747630a..6c56cc66b7533e61c3231a78319bb709ca7004e0 100644
--- a/src/include/port/win32.h
+++ b/src/include/port/win32.h
@@ -283,20 +283,32 @@ typedef int pid_t;
 #define EAFNOSUPPORT WSAEAFNOSUPPORT
 #undef EWOULDBLOCK
 #define EWOULDBLOCK WSAEWOULDBLOCK
+#undef ECONNABORTED
+#define ECONNABORTED WSAECONNABORTED
 #undef ECONNRESET
 #define ECONNRESET WSAECONNRESET
 #undef EINPROGRESS
 #define EINPROGRESS WSAEINPROGRESS
+#undef EISCONN
+#define EISCONN WSAEISCONN
 #undef ENOBUFS
 #define ENOBUFS WSAENOBUFS
 #undef EPROTONOSUPPORT
 #define EPROTONOSUPPORT WSAEPROTONOSUPPORT
 #undef ECONNREFUSED
 #define ECONNREFUSED WSAECONNREFUSED
-#undef EBADFD
-#define EBADFD WSAENOTSOCK
+#undef ENOTSOCK
+#define ENOTSOCK WSAENOTSOCK
 #undef EOPNOTSUPP
 #define EOPNOTSUPP WSAEOPNOTSUPP
+#undef EADDRINUSE
+#define EADDRINUSE WSAEADDRINUSE
+#undef EADDRNOTAVAIL
+#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
+#undef EHOSTUNREACH
+#define EHOSTUNREACH WSAEHOSTUNREACH
+#undef ENOTCONN
+#define ENOTCONN WSAENOTCONN
 
 /*
  * Extended locale functions with gratuitous underscore prefixes.