diff --git a/ghc/lib/misc/SocketPrim.lhs b/ghc/lib/misc/SocketPrim.lhs
index d88e3d72e3cb62dd848f5ce0ebb028e420760952..e76118574e100dfffbe88dda8f5a09712be6c83b 100644
--- a/ghc/lib/misc/SocketPrim.lhs
+++ b/ghc/lib/misc/SocketPrim.lhs
@@ -1252,7 +1252,7 @@ use @withSocketsDo@...:
 
 \begin{code}
 withSocketsDo :: IO a -> IO a
-#ifndef _WIN32
+#if !defined(HAVE_WINSOCK_H) || defined(__CYGWIN32__)
 withSocketsDo x = x
 #else
 withSocketsDo act = do
diff --git a/ghc/lib/misc/cbits/ghcSockets.h b/ghc/lib/misc/cbits/ghcSockets.h
index 175f8b886869a02ddd3764030225f959c303c5a5..f2f636a11fd8f9d8e275f5236b8d14e76e11c88a 100644
--- a/ghc/lib/misc/cbits/ghcSockets.h
+++ b/ghc/lib/misc/cbits/ghcSockets.h
@@ -1,7 +1,7 @@
 #ifndef GHC_SOCKETS_H
 #define GHC_SOCKETS_H
 
-#ifdef HAVE_WINSOCK_H
+#if defined(HAVE_WINSOCK_H) && !defined(__CYGWIN__)
 #include <winsock.h>
 #else
 
@@ -94,7 +94,7 @@ StgInt	setSocketOption__ (StgInt, StgInt, StgInt);
 StgInt	writeDescriptor (StgInt, StgAddr, StgInt);
 
 /* initWinSock.c */
-#ifdef _WIN32
+#if defined(HAVE_WINSOCK_H) && !defined(__CYGWIN__)
 StgInt  initWinSock();
 void    shutdownWinSock();
 #endif
diff --git a/ghc/lib/misc/cbits/initWinSock.c b/ghc/lib/misc/cbits/initWinSock.c
index 7ea4de6a9f9c899bf150dea6ca451fe5f5add636..d1c2b80677e7c6657dc0790f6b1c27c301ffe607 100644
--- a/ghc/lib/misc/cbits/initWinSock.c
+++ b/ghc/lib/misc/cbits/initWinSock.c
@@ -5,10 +5,13 @@
 #include "stgio.h"
 
 
-#ifdef _WIN32
+#if defined(HAVE_WINSOCK_H) && !defined(__CYGWIN__)
+#define USE_WINSOCK
+#endif
 
-/* Initialising WinSock... */
+#ifdef USE_WINSOCK
 
+/* Initialising WinSock... */
 StgInt
 initWinSock ()
 {