packages feed

alms-0.6.0: examples/netcat.alms

(* Poor programmer's telnet *)

open Prim.Socket

local
  open IO
with
  let rec sendThread sock =
    if hIsEOF stdin
      then
        shutdown sock ShutdownSend
      else
        try
          send sock (getLine () ^ "\r\n");
          sendThread sock
        with
          IOError _ → ()

  let rec recvThread sock =
    try
      putStr (recv sock 1024);
      recvThread sock
    with
      IOError _ → ()
end

let setupConnection addr =
  let s = socket AF_INET Stream defaultProtocol in
    connect s addr;
    s

let getAddr () =
  match getArgs () with
  | [host, port]
      → let info = AddrInfo([], AF_INET,
                            Stream, defaultProtocol,
                            SockAddrInet(PortNum 0, 0), None) in
        (match getAddrInfo (Some info) (Some host) (Some port) with
         | AddrInfo (_, _, _, _, sockAddr, _) ∷ _ → sockAddr
         | _ → failwith ("Could not resolve address "^host^":"^port))
  | _ → failwith ("Usage: " ^ getProgName () ^ " HOST SERVICE")

let main () =
  let sock = setupConnection (getAddr ()) in
  let wait = Future.new (λ () → recvThread sock) in
    sendThread sock;
    Future.sync wait;
    close sock

in main ()