(** Gestion d'une connexion *)
let treat_connection f socket =
  let buffer_size = 4096 in
  let buffer = String.create buffer_size in
  let rec treat () =
    match read socket buffer 0 buffer_size with
      | 0 -> close socket
      | nb ->
          let v = f (String.sub buffer 0 nbin
          ignore (write socket v 0 nb);
          treat () in
  treat ();;

(** Conversion d'une chaîne de caratères en n° de port tcp *)
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");;

(** Récupération des arguments *)
let main () =
  if Array.length Sys.argv <> 2 then
    begin
      prerr_endline ("Usage: "^Sys.argv.(0)^" port");
      exit 1
    end
  else
    try
      establish_iterative_server (treat_connection String.uppercase) (port_of_string Sys.argv.(1))
    with Failure "port_of_string" ->
      prerr_endline ("Unknown port: "^Sys.argv.(2));
      exit 2;;

handle_unix_error main ();;