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