packages feed

alms-0.6.0: examples/echoServer.alms

(* Echo server written using state-tracked sockets. *)

#load "libsocketcap"

module EchoServer = struct
  open ASocket

  (* This is a bit different than the version in the paper, because
   * it uses exceptions. *)
  let handleClient sock f cap =
    let rec loop cap =
      let (str, cap) = recv sock 1024 cap in
      let cap        = send sock (f str) cap in
        loop cap
     in try
          loop cap
        with SocketError _ → ()

  let rec acceptLoop sock f cap =
    let ((clientsock, clientcap), cap) = accept sock cap in
      putStrLn "Opened connection";
      (Thread.fork :> (unit -A> unit) → Thread.thread)
        (λ _ → handleClient clientsock f clientcap;
               putStrLn "Closed connection");
      acceptLoop sock f cap

  let serve port f =
    let (sock, cap) = socket () in
    let cap = bind sock port cap in
    let cap = listen sock cap in
      acceptLoop sock f cap
end

let serverFun (s: string) = s

let main argv =
  match argv with
  | [port] → EchoServer.serve (int_of_string port) serverFun
  | _      → failwith "Usage: echoServer.aff PORT\n"

in main (getArgs ())