diff --git a/Example.hs b/Example.hs
--- a/Example.hs
+++ b/Example.hs
@@ -3,21 +3,29 @@
 import Network.Socket hiding (recv)
 import Network.Socket.ByteString
 import Network.BSD
+import Network
 import Data.ByteString.Char8 ()
+import qualified Data.ByteString.Char8 as BC
 
+import System.IO (hClose, hFlush)
 import System.Environment (getArgs)
 
 main = do
 	args <- getArgs
+	let serverName = "localhost"
+	let serverPort = 1080
 	let destinationName = case args of
 		[]    -> "www.google.com"
 		(x:_) -> x
 	-- socks server is expected to be running on localhost port 1080
-	he     <- getHostByName "localhost"
-	let socksServerAddr = SockAddrInet 1080 (head $ hostAddresses he)
+	he     <- getHostByName serverName
+	let socksServerAddr = SockAddrInet serverPort (head $ hostAddresses he)
 
 	example1 socksServerAddr destinationName
 	example2 socksServerAddr destinationName
+
+	example3 serverName serverPort destinationName 80
+
 	where
 		-- connect to @destName on port 80 through the socks server
 		-- www.google.com get resolve on the client here and then the sockaddr is
@@ -40,3 +48,10 @@
 			sendAll socket "GET / HTTP/1.0\r\n\r\n"
 			recv socket 4096 >>= putStrLn . show
 			sClose socket
+
+		example3 sname sport dname dport = do	
+			handle <- socksConnectTo sname (PortNumber sport) dname (PortNumber dport)
+			BC.hPut handle "GET / HTTP/1.0\r\n\r\n"
+			hFlush handle
+			BC.hGet handle 1024 >>= putStrLn . show
+			hClose handle
diff --git a/Network/Socks5.hs b/Network/Socks5.hs
--- a/Network/Socks5.hs
+++ b/Network/Socks5.hs
@@ -10,16 +10,21 @@
 module Network.Socks5
 	( socksConnectAddr
 	, socksConnectName
+	, socksConnectTo
 	) where
 
 import Control.Monad
-import Network.Socket (Socket, SockAddr(..), PortNumber, connect)
+import Control.Exception
+import Network.Socket
+import Network.BSD
 import Network.Socks5.Command
 import Network.Socks5.Types
+import Network
+import System.IO
 
-withSocks socket sockaddr f = do
-	connect socket sockaddr
-	r <- socks5Establish socket [SocksMethodNone]
+withSocks sock sockaddr f = do
+	connect sock sockaddr
+	r <- socks5Establish sock [SocksMethodNone]
 	when (r == SocksMethodNotAcceptable) $ error "cannot connect with no socks method of authentication"
 	f
 
@@ -30,15 +35,34 @@
 --
 -- |socket|-----sockServer----->|server|----destAddr----->|destination|
 socksConnectAddr :: Socket -> SockAddr -> SockAddr -> IO ()
-socksConnectAddr socket sockserver destaddr = withSocks socket sockserver $ do
+socksConnectAddr sock sockserver destaddr = withSocks sock sockserver $ do
 	case destaddr of
-		SockAddrInet p h      -> socks5ConnectIPV4 socket h p >> return ()
-		SockAddrInet6 p _ h _ -> socks5ConnectIPV6 socket h p >> return ()
+		SockAddrInet p h      -> socks5ConnectIPV4 sock h p >> return ()
+		SockAddrInet6 p _ h _ -> socks5ConnectIPV6 sock h p >> return ()
 		SockAddrUnix _        -> error "unsupported unix sockaddr type"
 
 -- | connect a new socket to the socks server, and connect the stream to a FQDN
 -- resolved on the server side.
 socksConnectName :: Socket -> SockAddr -> String -> PortNumber -> IO ()
-socksConnectName socket sockserver destination port = withSocks socket sockserver $ do
-	_ <- socks5ConnectDomainName socket destination port
+socksConnectName sock sockserver destination port = withSocks sock sockserver $ do
+	_ <- socks5ConnectDomainName sock destination port
 	return ()
+
+-- | similar to Network connectTo but use a socks proxy.
+socksConnectTo :: String -> PortID -> String -> PortID -> IO Handle
+socksConnectTo sockshost socksport desthost destport = do
+	sport <- resolvePortID socksport
+	dport <- resolvePortID destport
+
+	proto <- getProtocolNumber "tcp"
+	bracketOnError (socket AF_INET Stream proto) sClose (go sport dport)
+	where
+		go sport dport sock = do
+			he <- getHostByName sockshost
+			let sockaddr = SockAddrInet sport (hostAddress he)
+			socksConnectName sock sockaddr desthost dport
+			socketToHandle sock ReadWriteMode
+
+		resolvePortID (Service serv) = getServicePortNumber serv
+		resolvePortID (PortNumber n) = return n
+		resolvePortID _              = error "unsupported unix PortID"
diff --git a/Network/Socks5/Command.hs b/Network/Socks5/Command.hs
--- a/Network/Socks5/Command.hs
+++ b/Network/Socks5/Command.hs
@@ -81,4 +81,4 @@
 	r (Partial cont) = ioget >>= r . cont
 	r (Done a b)
 		| not $ B.null b = error "got too many bytes while receiving data"
-		| otherwise      = putStrLn (show a) >> return a
+		| otherwise      = return a
diff --git a/socks.cabal b/socks.cabal
--- a/socks.cabal
+++ b/socks.cabal
@@ -1,5 +1,5 @@
 Name:                socks
-Version:             0.1.0
+Version:             0.2.0
 Description:         Socks proxy (version 5) implementation.
 License:             BSD3
 License-file:        LICENSE
@@ -24,3 +24,7 @@
                      Network.Socks5.Types
                      Network.Socks5.Command
   ghc-options:       -Wall -fno-warn-missing-signatures
+
+source-repository head
+  type: git
+  location: git://github.com/vincenthz/hs-socks
