Skip to content
Snippets Groups Projects
Commit a69724d8 authored by sof's avatar sof
Browse files

[project @ 1998-07-20 09:43:38 by sof]

In a moment of boredom, converted to use do notation
parent c818b1b8
No related merge requests found
...@@ -55,7 +55,7 @@ signalling that the current hostname applies. ...@@ -55,7 +55,7 @@ signalling that the current hostname applies.
\begin{code} \begin{code}
data PortID = data PortID =
Service String -- Service Name eg "ftp" Service String -- Service Name eg "ftp"
| PortNumber Int -- User defined Port Number | PortNumber PortNumber -- User defined Port Number
#ifndef cygwin32_TARGET_OS #ifndef cygwin32_TARGET_OS
| UnixSocket String -- Unix family socket in file system | UnixSocket String -- Unix family socket in file system
#endif #endif
...@@ -73,25 +73,25 @@ connectTo :: Hostname -- Hostname ...@@ -73,25 +73,25 @@ connectTo :: Hostname -- Hostname
-> PortID -- Port Identifier -> PortID -- Port Identifier
-> IO Handle -- Connected Socket -> IO Handle -- Connected Socket
connectTo hostname (Service serv) = connectTo hostname (Service serv) = do
getProtocolNumber "tcp" >>= \ proto -> proto <- getProtocolNumber "tcp"
socket AF_INET Stream proto >>= \ sock -> sock <- socket AF_INET Stream proto
getServicePortNumber serv >>= \ port -> port <- getServicePortNumber serv
getHostByName hostname >>= \ (HostEntry _ _ _ haddrs) -> he <- getHostByName hostname
connect sock (SockAddrInet port (head haddrs)) >> connect sock (SockAddrInet port (hostAddress he))
socketToHandle sock ReadWriteMode >>= \ h -> socketToHandle sock ReadWriteMode
return h
connectTo hostname (PortNumber port) = connectTo hostname (PortNumber port) = do
getProtocolNumber "tcp" >>= \ proto -> proto <- getProtocolNumber "tcp"
socket AF_INET Stream proto >>= \ sock -> sock <- socket AF_INET Stream proto
getHostByName hostname >>= \ (HostEntry _ _ _ haddrs) -> he <- getHostByName hostname
connect sock (SockAddrInet port (head haddrs)) >> connect sock (SockAddrInet port (hostAddress he))
socketToHandle sock ReadWriteMode socketToHandle sock ReadWriteMode
#ifndef cygwin32_TARGET_OS #ifndef cygwin32_TARGET_OS
connectTo _ (UnixSocket path) = connectTo _ (UnixSocket path) = do
socket AF_UNIX Datagram 0 >>= \ sock -> sock <- socket AF_UNIX Datagram 0
connect sock (SockAddrUnix path) >> connect sock (SockAddrUnix path)
socketToHandle sock ReadWriteMode socketToHandle sock ReadWriteMode
#endif #endif
...@@ -104,23 +104,25 @@ socket which has been bound to the specified port. ...@@ -104,23 +104,25 @@ socket which has been bound to the specified port.
listenOn :: PortID -- Port Identifier listenOn :: PortID -- Port Identifier
-> IO Socket -- Connected Socket -> IO Socket -- Connected Socket
listenOn (Service serv) = listenOn (Service serv) = do
getProtocolNumber "tcp" >>= \ proto -> proto <- getProtocolNumber "tcp"
socket AF_INET Stream proto >>= \ sock -> sock <- socket AF_INET Stream proto
getServicePortNumber serv >>= \ port -> port <- getServicePortNumber serv
bindSocket sock (SockAddrInet port iNADDR_ANY) >> bindSocket sock (SockAddrInet port iNADDR_ANY)
listen sock maxListenQueue >> listen sock maxListenQueue
return sock return sock
listenOn (PortNumber port) =
getProtocolNumber "tcp" >>= \ proto -> listenOn (PortNumber port) = do
socket AF_INET Stream proto >>= \ sock -> proto <- getProtocolNumber "tcp"
bindSocket sock (SockAddrInet port iNADDR_ANY) >> sock <- socket AF_INET Stream proto
listen sock maxListenQueue >> bindSocket sock (SockAddrInet port iNADDR_ANY)
listen sock maxListenQueue
return sock return sock
#ifndef cygwin32_TARGET_OS #ifndef cygwin32_TARGET_OS
listenOn (UnixSocket path) = listenOn (UnixSocket path) = do
socket AF_UNIX Datagram 0 >>= \ sock -> sock <- socket AF_UNIX Datagram 0
bindSocket sock (SockAddrUnix path) >> bindSocket sock (SockAddrUnix path)
return sock return sock
#endif #endif
\end{code} \end{code}
...@@ -129,12 +131,12 @@ listenOn (UnixSocket path) = ...@@ -129,12 +131,12 @@ listenOn (UnixSocket path) =
accept :: Socket -- Listening Socket accept :: Socket -- Listening Socket
-> IO (Handle, -- StdIO Handle for read/write -> IO (Handle, -- StdIO Handle for read/write
HostName) -- HostName of Peer socket HostName) -- HostName of Peer socket
accept sock = do
accept sock = ~(sock', (SockAddrInet _ haddr)) <- SocketPrim.accept sock
SocketPrim.accept sock >>= \ (sock', (SockAddrInet _ haddr)) -> (HostEntry peer _ _ _) <- getHostByAddr AF_INET haddr
getHostByAddr AF_INET haddr >>= \ (HostEntry peer _ _ _) -> handle <- socketToHandle sock ReadWriteMode
socketToHandle sock ReadWriteMode >>= \ handle ->
return (handle, peer) return (handle, peer)
\end{code} \end{code}
Send and recived data from/to the given host and port number. These Send and recived data from/to the given host and port number. These
...@@ -148,45 +150,48 @@ sendTo :: Hostname -- Hostname ...@@ -148,45 +150,48 @@ sendTo :: Hostname -- Hostname
-> PortID -- Port Number -> PortID -- Port Number
-> String -- Message to send -> String -- Message to send
-> IO () -> IO ()
sendTo h p msg = sendTo h p msg = do
connectTo h p >>= \ s -> s <- connectTo h p
hPutStr s msg >> hPutStr s msg
hClose s hClose s
recvFrom :: Hostname -- Hostname recvFrom :: Hostname -- Hostname
-> PortID -- Port Number -> PortID -- Port Number
-> IO String -- Received Data -> IO String -- Received Data
recvFrom host port = recvFrom host port = do
listenOn port >>= \ s -> s <- listenOn port
let let
waiting = waiting = do
SocketPrim.accept s >>= \ (s', (SockAddrInet _ haddr)) -> ~(s', SockAddrInet _ haddr) <- SocketPrim.accept s
getHostByAddr AF_INET haddr >>= \ (HostEntry peer _ _ _) -> (HostEntry peer _ _ _) <- getHostByAddr AF_INET haddr
if peer /= host then if peer /= host
sClose s' >> then do
waiting sClose s'
else waiting
readSocketAll s' >>= \ msg -> else do
sClose s' >> msg <- readSocketAll s'
return msg sClose s'
in return msg
waiting >>= \ message ->
sClose s >> message <- waiting
sClose s
return message return message
\end{code} \end{code}
Access function returning the port type/id of socket. Access function returning the port type/id of socket.
\begin{code} \begin{code}
socketPort :: Socket -> IO PortID socketPort :: Socket -> IO PortID
socketPort s = socketPort s = do
getSocketName s >>= \ sockaddr -> sockaddr <- getSocketName s
return (case sockaddr of return (portID sockaddr)
SockAddrInet port _ -> where
(PortNumber port) portID sa =
case sa of
SockAddrInet port _ -> PortNumber port
#ifndef cygwin32_TARGET_OS #ifndef cygwin32_TARGET_OS
SockAddrUnix path -> SockAddrUnix path -> UnixSocket path
(UnixSocket path)
#endif #endif
)
\end{code} \end{code}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment