diff --git a/Network/Run/Core.hs b/Network/Run/Core.hs
--- a/Network/Run/Core.hs
+++ b/Network/Run/Core.hs
@@ -7,6 +7,7 @@
   , openServerSocket
   ) where
 
+import qualified Control.Exception as E
 import Network.Socket
 
 resolve :: SocketType -> Maybe HostName -> ServiceName -> Bool -> IO AddrInfo
@@ -22,8 +23,7 @@
 openSocket addr = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
 
 openServerSocket :: AddrInfo -> IO Socket
-openServerSocket addr = do
-    sock <- openSocket addr
+openServerSocket addr = E.bracketOnError (openSocket addr) close $ \sock -> do
     setSocketOption sock ReuseAddr 1
     withFdSocket sock $ setCloseOnExecIfNeeded
     bind sock $ addrAddress addr
diff --git a/Network/Run/TCP.hs b/Network/Run/TCP.hs
--- a/Network/Run/TCP.hs
+++ b/Network/Run/TCP.hs
@@ -24,8 +24,7 @@
     E.bracket (open addr) close client
 #endif
   where
-    open addr = do
-        sock <- openSocket addr
+    open addr = E.bracketOnError (openSocket addr) close $ \sock -> do
         connect sock $ addrAddress addr
         return sock
 
@@ -35,14 +34,13 @@
     addr <- resolve Stream mhost port True
     E.bracket (open addr) close loop
   where
-    open addr = do
-        sock <- openServerSocket addr
+    open addr = E.bracketOnError (openServerSocket addr) close $ \sock -> do
         listen sock 1024
         return sock
-    loop sock = forever $ do
-        (conn, _peer) <- accept sock
+    loop sock = forever $ E.bracketOnError (accept sock) (close . fst) $
+        \(conn, _peer) ->
 #if MIN_VERSION_network(3,1,1)
-        void $ forkFinally (server conn) (const $ gracefulClose conn 5000)
+          void $ forkFinally (server conn) (const $ gracefulClose conn 5000)
 #else
-        void $ forkFinally (server conn) (const $ close conn)
+          void $ forkFinally (server conn) (const $ close conn)
 #endif
diff --git a/network-run.cabal b/network-run.cabal
--- a/network-run.cabal
+++ b/network-run.cabal
@@ -1,5 +1,5 @@
 name:                network-run
-version:             0.2.2
+version:             0.2.3
 synopsis:            Simple network runner library
 description:         Simple functions to run network clients and servers.
 -- bug-reports:
