The POSIX environment provides basic support for network programming over TCP sockets. We repeat part of module POSIX:
module POSIX where ... data Host = Host String data Port = Port Int struct Internet where tcp :: Sockets struct Socket < Closable where remoteHost :: Host remotePort :: Port inFile :: RFile outFile :: WFile struct Connection < Closable where established :: Action neterror :: String -> Action struct Sockets where connect :: Host -> Port -> (Socket -> Class Connection) -> Request() listen :: Port -> (Socket -> Class Connection) -> Request Closable instance showHost :: Show Host showHost = struct show (Host nm) = nm
Typically, a network program consists of two program parts, a client and a server, executing on different hosts, connected to the internet. The parts communicate over a socket, an abstraction of a communication channel. A socket has selectors to give the host and port of the remote peer and two files, an RFile for reading and a WFile for writing. The main body of both the server and the client is a function of type Socket -> Class Connection. This function has access to a socket and must define methods describing how to handle the events a network program must react to: an established message when the cnnection has been established, a neterror message in case of problems and a close message from the remote peer.
The client tries to connect to a server by specifying a host and a port; the server just specifies a port on which to listen. Whenever a client connects to a host on a port and there is a server listening on that port, a socket is created for each party with files set up for communication and an established message is sent to both parties. Typically, code in the body of established will register callbacks with the infiles.
For examples, see EchoServer and TCPClient.
Presently, only TCP sockets are supported. A future release may provide support for UDP sockets.