open Sys;;

let establish_concurrent_server f port =
  (* Récupération de tous les zombis *)
  let rec wait_for_children signal =
    try
      let pid,_ = waitpid [WNOHANG] (-1) in
      if pid <> 0 then wait_for_children signal
    with Unix_error(ECHILD,_,_) -> () in
  ignore (signal sigchld (Signal_handle wait_for_children));
  ignore (signal sigpipe Signal_ignore);
  (* Service de chaque connexion *)
  let socket_server = open_server port in
  let rec server () =
    begin
      try
        let socket_connectionclient_addr = accept socket_server in
        setsockopt_float socket_connection SO_RCVTIMEO 10.;
        setsockopt_float socket_connection SO_SNDTIMEO 10.;
        eprintf "Connection from %s.\n" (string_of_sockaddr client_addr);
        Pervasives.flush Pervasives.stderr;
        try
          match fork () with
          | 0 -> f socket_connectionexit 0
          | pid -> close socket_connection
        with Unix_error ((EAGAIN | ENOMEMas err__) ->
          close socket_connection;
          prerr_endline (error_message err)
      with Unix_error(EINTR,_,_) -> ()
    end;
    server ()
  in server ();;