summaryrefslogtreecommitdiff
path: root/ghc/misc/examples/net007/Main.hs
diff options
context:
space:
mode:
Diffstat (limited to 'ghc/misc/examples/net007/Main.hs')
-rw-r--r--ghc/misc/examples/net007/Main.hs44
1 files changed, 44 insertions, 0 deletions
diff --git a/ghc/misc/examples/net007/Main.hs b/ghc/misc/examples/net007/Main.hs
new file mode 100644
index 0000000000..fbc9ff04e0
--- /dev/null
+++ b/ghc/misc/examples/net007/Main.hs
@@ -0,0 +1,44 @@
+{- server
+
+As net003 but uses the BSD module for portability. Also prints the
+common name of the host rather than its IP number.
+
+TESTS:
+ getProtocolNumber
+ getSocketName
+ getHostByAddr
+
+-}
+
+module Main where
+
+import BSD
+import SocketPrim
+
+main =
+ getProtocolNumber "tcp" >>= \ proto ->
+ socket AF_INET Stream proto >>= \ s ->
+ bindSocket s (SockAddrInet aNY_PORT iNADDR_ANY) >>
+ getSocketName s >>= \ (SockAddrInet port _) ->
+ putStr ("Allocated Port Number: " ++ show port ++ "\n") >>
+ listen s 5 >>
+
+
+ let
+ loop =
+ accept s >>= \ (s',(SockAddrInet _ haddr)) ->
+ getHostByAddr AF_INET haddr >>= \ (HostEntry hname _ _ _) ->
+ putStr ("*** Start of Transfer from: " ++ hname ++ "***\n") >>
+ let
+ read_all =
+ readSocket s' 4 >>= \ (str, nbytes) ->
+ if nbytes /= 0 then
+ putStr str >>
+ read_all
+ else
+ putStr "\n*** End of Transfer ***\n" >>
+ sClose s'
+ in
+ read_all
+ in
+ loop