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 ()