summaryrefslogtreecommitdiff
path: root/net/client.hs
diff options
context:
space:
mode:
Diffstat (limited to 'net/client.hs')
-rw-r--r--net/client.hs30
1 files changed, 30 insertions, 0 deletions
diff --git a/net/client.hs b/net/client.hs
new file mode 100644
index 0000000..863df6e
--- /dev/null
+++ b/net/client.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE OverloadedStrings #-}
+-- Echo client program
+module Main (main) where
+
+import qualified Control.Exception as E
+import qualified Data.ByteString.Char8 as C
+import Network.Socket
+import Network.Socket.ByteString (recv, sendAll)
+
+main :: IO ()
+main = runTCPClient "127.0.0.1" "3000" $ \s -> do
+ sendAll s "Hello, world!"
+ msg <- recv s 1024
+ putStr "Received: "
+ C.putStrLn msg
+
+-- from the "network-run" package.
+runTCPClient :: HostName -> ServiceName -> (Socket -> IO a) -> IO a
+runTCPClient host port client = withSocketsDo $ do
+ addr <- resolve
+ E.bracket (open addr) close client
+ where
+ resolve = do
+ let hints = defaultHints { addrSocketType = Stream }
+ head <$> getAddrInfo (Just hints) (Just host) (Just port)
+ open addr = do
+ sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
+ connect sock $ addrAddress addr
+ return sock
+