summaryrefslogtreecommitdiff
path: root/net/client.hs
diff options
context:
space:
mode:
authorAndrew Guschin <saintruler@gmail.com>2020-11-26 13:55:55 +0400
committerAndrew Guschin <saintruler@gmail.com>2020-11-26 13:55:55 +0400
commit446602fe336ad1c2a23e3d50d7cd1d1356fcc9de (patch)
tree74b8a1ca93c17d22f7876f6aba80ee10c3851d3b /net/client.hs
Initial commit
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
+