diff --git a/hsyslog-tcp.cabal b/hsyslog-tcp.cabal
--- a/hsyslog-tcp.cabal
+++ b/hsyslog-tcp.cabal
@@ -1,5 +1,5 @@
 name:                hsyslog-tcp
-version:             0.2.0.0
+version:             0.2.1.0
 synopsis:            syslog over TCP
 description:
 homepage:            https://github.com/osa1/hsyslog-tcp#readme
diff --git a/src/System/Posix/Syslog/TCP.hs b/src/System/Posix/Syslog/TCP.hs
--- a/src/System/Posix/Syslog/TCP.hs
+++ b/src/System/Posix/Syslog/TCP.hs
@@ -56,6 +56,7 @@
   ) where
 
 --------------------------------------------------------------------------------
+import Control.Exception (onException, mask)
 import qualified Data.ByteString as BS
 import qualified Data.ByteString.Char8 as BS8
 import Data.Monoid
@@ -92,22 +93,24 @@
 initSyslog :: SyslogConfig -> IO SyslogConn
 initSyslog config = do
     let addr = _address config
-    socket <- N.socket (N.addrFamily addr) (N.addrSocketType addr) (N.addrProtocol addr)
-    N.connect socket (N.addrAddress addr)
-    let
-      send_fn fac sev msg =
-        case maskedPriVal (_severityMask config) fac sev of
-          Nothing -> return ()
-          Just priVal -> do
-            time <- getCurrentTime
-            let bs = getProtocol (_protocol config)
-                     priVal time (_hostName config) (_appName config)
-                     (_processId config) msg
-            N.sendAll socket bs
+    mask $ \restore -> do
+      socket <- N.socket (N.addrFamily addr) (N.addrSocketType addr) (N.addrProtocol addr)
+      restore (N.connect socket (N.addrAddress addr)) `onException` N.close socket
 
-      close_fn = N.close socket
+      let
+        send_fn fac sev msg =
+          case maskedPriVal (_severityMask config) fac sev of
+            Nothing -> return ()
+            Just priVal -> do
+              time <- getCurrentTime
+              let bs = getProtocol (_protocol config)
+                       priVal time (_hostName config) (_appName config)
+                       (_processId config) msg
+              N.sendAll socket bs
 
-    return (SyslogConn send_fn close_fn)
+        close_fn = N.close socket
+
+      return (SyslogConn send_fn close_fn)
 
 -- | Configuration options for connecting and logging to your syslog socket.
 data SyslogConfig = SyslogConfig
