open Unix;;
open Sys;;
open Printf;;

let client host port =
  let server = ADDR_INET (host,portin
  let client = socket PF_INET SOCK_DGRAM 0 in
  let buffer_size = 1024 in
  let buffer = String.create buffer_size in
  connect client server;
  setsockopt_float  client SO_RCVTIMEO 1.;
  let rec process_loop () =
    let s = read_line () in
    let len = String.length s in
    if len == 0 then ()
    else
      begin
        if len < buffer_size then
          begin
            ignore (write client s 0 (String.length s));
            try
              let n = read client buffer 0 buffer_size in
              output Pervasives.stdout buffer 0 n;
              print_newline ();
            with
              Unix_error (EAGAIN,"read",_) -> prerr_endline "Timeout"
          end
        else
          prerr_endline "String too long";
        process_loop ()
      end in
  process_loop();;

let port_of_string port =
  try
    try
      (getservbyname port "tcp").s_port
    with Not_found -> int_of_string port
  with _ -> raise (Failure "port_of_string");;

let inet_addr_of_name machine =
  try
    (gethostbyname machine).h_addr_list.(0)
  with _ -> raise (Failure "inet_addr_of_name");;

let main () =
  if Array.length Sys.argv <> 3 then
    begin
      prerr_endline ("Usage: "^Sys.argv.(0)^" machine port");
      exit 1
    end
  else
    try
      let addr = inet_addr_of_name Sys.argv.(1) in
      let port = port_of_string  Sys.argv.(2) in
      client addr port
    with
      Failure "inet_addr_of_name" ->
        prerr_endline ("Unknown host: "^Sys.argv.(1));
        exit 2
    | Failure "port_of_string" ->
        prerr_endline ("Unknown port: "^Sys.argv.(2));
        exit 3;;
handle_unix_error main ();;